我正在研究一个旧的代码库,几乎每个free()的调用都在其参数上使用一个强制转换。 例如, free((float *)velocity); free((float *)acceleration); free((char *)label); 每个指针都是对应的(和匹配的)types。 我根本看不到这一点。 这是非常古老的代码,所以我想知道这是否是一个K&R的事情。 如果是这样,我实际上希望支持那些可能需要这个的编译器,所以我不想删除它们。 有没有技术上的理由来使用这些演员? 我甚至没有看到使用它们的实用理由。 在释放数据之前,有什么要提醒自己的数据types? 编辑:这个问题不是其他问题的重复。 另外一个问题就是这个问题的一个特例,我认为如果接近的选民会阅读所有的答案,那么这个问题是显而易见的。 Colophon:我给“常量答案”一个复选标记,因为这是可能需要完成的一个真正的理由。 然而,关于它是一个ANSI C之前的习惯(至less在一些程序员之间)的答案似乎是它被用于我的情况的原因。 这里有很多人的好点子。 感谢你的贡献。
从这里发布的问题的数量来看,很明显,人们在指针和指针算术的头脑中有一些非常有意思的问题。 我很想知道为什么。 他们从来没有真正引起我的重大问题(虽然我第一次了解到他们在新石器时代)。 为了给这些问题写出更好的答案,我想知道人们觉得困难。 所以,如果你正在用指针挣扎,或者你最近突然“知道了”,指针的哪些方面会给你带来问题?
我今天刚看了一张照片,觉得我会很感激的解释。 所以这里是图片: 我发现这是令人困惑的,并想知道这样的代码是否可行。 我GOOGLE了图片,发现在这个 reddit条目中的另一张图片,这里是图片: 那么这个“螺旋式阅读”是有效的? 这是如何C编译器parsing? 如果对这个奇怪的代码有更简单的解释,那将会很棒。 除此之外,这些代码可以用吗? 如果是的话,何时何地? 有一个关于“螺旋规则”的问题,但我不只是问如何应用它,或者如何用这个规则来读取expression式。 我质疑这样的expression式和螺旋规则的有效性的使用。 关于这些,一些很好的答案已经发布。
关于C的信誉来源,讨论&运算符后给出以下信息: ……有些遗憾的是,这个术语[地址]仍然存在,因为它混淆了那些不知道地址是关于什么的人,并且误导了那些做了这些事情的人:把指针看作是地址,通常会导致悲伤。 。 我曾经读过的其他材料(从同样有名的来源,我会说)总是毫不掩饰地指向指针, &运算符提供内存地址。 我很想继续寻找事情的真相,但是当信誉良好的消息来源不同意的时候,这是有点困难的。 现在我有点困惑 – 什么是一个指针,那么,如果不是一个内存地址? PS 作者后来说: 我会继续使用“地址”这个词,因为发明一个不同的地方 会更糟。
我已经通过其他的答案看,但似乎无法得到这个工作。 我正在试图调用DLL中的函数来与SMBus设备进行通信。 这个函数需要一个指向结构的指针,该结构有一个数组作为它的一个字段。 所以… 在C: typedef struct _SMB_REQUEST { unsigned char Address; unsigned char Command; unsigned char BlockLength; unsigned char Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST; 我想我必须设置值,地址,命令和BlockLength,而DLL填充数据数组。 需要此结构的函数将其作为指针 SMBUS_API int SmBusReadByte( SMBUS_HANDLE handle, SMB_REQUEST *request ); 所以我在Python中设置了这样的结构: class SMB_REQUEST(ctypes.Structure): _fields_ = [("Address", c_char), ("Command", c_char), ("BlockLength", c_char), ("Data", type(create_string_buffer(SMB_MAX_DATA_SIZE))] *注意:我也尝试过ctypes.c_char * SMB_MAX_DATA_SIZE作为数据types* 要传递一个指向这个types的结构体的指针,我试图初始化它,如下所示: data = create_string_buffer(SMB_MAX_DATA_SIZE) smb_request = […]
我有几个不同的function,看起来像这样的代码: void someFunction (int *data) { data = (int *) malloc (sizeof (data)); } void useData (int *data) { printf ("%p", data); } int main () { int *data = NULL; someFunction (data); useData (data); return 0; } someFunction ()和useData ()在单独的模块(* .c文件)中定义。 问题是,虽然malloc工作正常,并且分配的内存在someFunction函数中可用,但是一旦函数返回,相同的内存就不可用。 程序的一个例子可以在这里看到,输出显示了不同的内存地址。 有人可以请给我解释我在这里做错了什么,我怎么能得到这个代码工作? 编辑:所以它看起来像我需要使用双指针来做到这一点 – 当我真的需要使用双指针时,我将如何去做同样的事情? 所以例如数据是 int **data = NULL; //used for […]
我正在寻找创build两个类,其中每个包含其他类types的对象。 我该怎么做? 如果我不能做到这一点,是否有一个解决方法,像每个类包含一个指向其他类types的指针 ? 谢谢! 这是我有: 文件: bar.h #ifndef BAR_H #define BAR_H #include "foo.h" class bar { public: foo getFoo(); protected: foo f; }; #endif 文件: foo.h #ifndef FOO_H #define FOO_H #include "bar.h" class foo { public: bar getBar(); protected: bar b; }; #endif 文件: main.cpp #include "foo.h" #include "bar.h" int main (int argc, char […]
#include<stdio.h> #include<string.h> int main() { char * p = "abc"; char * p1 = "abc"; printf("%d %d", p, p1); } 当我打印这两个指针的值时,它正在打印相同的地址。 为什么?
这个代码是什么意思? 这是你如何在PHP中声明一个指针? $this->entryId = $entryId;
这个问题受到类似问题的启发: 如何删除[]“知道”操作数数组的大小? 我的问题是有点不同: 有没有什么办法来以编程方式确定一个C ++数组的大小? 如果没有,为什么? 我见过的每个函数都需要一个整数参数来给它一个数组。 但是正如链接问题所指出的那样, delete[]必须知道要释放的内存的大小。 考虑一下这个C ++代码: int* arr = new int[256]; printf("Size of arr: %d\n", sizeof(arr)); 这将打印“ Size of arr: 4 ”,这只是指针的大小。 有一些打印256的函数会很好,但是我不认为它存在于C ++中。 (同样,问题的一部分是为什么它不存在。) 澄清 :我知道,如果我在栈上而不是堆声明数组(即“ int arr[256]; ”), sizeof运算符将返回1024(数组长度* sizeof(int))。