Tag: 指针

“释放的指针未被分配。”在malloc之后出错,realloc

我有以下代码的此错误: int main(){ point *points = malloc(sizeof(point)); if (points == NULL){ printf(“Memory allocation failed.\n”); return 1; } other_stuff(points); free(points); return 0; } void other_stuff(point points[]){ //stuff realloc(points, number*sizeof(point)) } 我搜索过,但只找到了很明显没有分配的例子。 在这里,我使用malloc初始化points ,后来用realloc改变了它的大小; 那么当我来free时,指针“未分配”怎么样?

当函数需要指针时传递一个常量整数

将常量整数值传递给需要指针的函数的最佳/最经典的方法是什么? 例如, writefunction write (int filedes, const void *buffer, size_t size); 假设我只想写一个字节(1),我会这样想: write (fd, 1, 1); 但我显然得到了警告 warning: passing argument 2 of ‘write’ makes pointer from integer without a cast 我知道我能做到 int i = 1; write (fd, &i, 1); 但这是必要的吗? 在不需要声明/初始化新变量的情况下,最正确的方法是什么?

free()跟随指针吗?

我确定它没有,但也许它里面有黑魔法,所以这是我的问题: 如果我有这样的结构: struct mystr { char * strp, unsigned int foo, }; 我为它分配内存,并希望稍后发布。 我必须这样做吗? free(mystr_var->strp); free(mystr_var); 或者是最后一行, free()函数是否遵循指针并释放它们两个?

指向结构的动态数组指针

我必须使用以下代码块进行学校作业,严格禁止任何修改。 typedef struct { char* firstName; char* lastName; int id; float mark; }* pStudentRecord; pStudentRecord* g_ppRecords; int g_numRecords =0; 这里g_ppRecords应该是一个指向结构的指针数组。 我完全没有理解的是, pStudentRecords *g_ppRecords;如何声明pStudentRecords *g_ppRecords; 意味着g_ppRecords是一个数组,因为数组应该被定义为 type arrayname[size]; 我尝试动态地为g_ppRecords分配内存,但这没有帮助。 g_ppRecords = (pStudentRecord*) malloc(sizeof(pStudentRecord*)*(g_numRecords+1));

新指针(通过malloc)与其中一个释放/旧指针相同

我试图跟踪C中的使用后免费错误。我的问题是,如果我有这样的代码: A * ptrA = malloc(sizeof(A)); A * aliasA = ptrA; // do something ‘ free(ptrA) // some other code B * ptrB = malloc(sizeof(B)); // assume this return same pointer as ptrA //trying to use aliasA here 只是想知道aliasA的使用是否是UAF错误? 如果是的话,这里出了什么问题? 要清除这个问题,我认为最好添加一个小例子: int main(){ int *ptr = (int *)malloc(4); *ptr = 5; int *ptr2 = ptr; […]

关于指针比较,标准中的措辞比较奇怪

§6.5.8\ 6 (关于>,<, =) 如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比P大。 在所有其他情况下,行为未定义。 上面的几节,§6.5.8,它解释了基本上,指针算法在数组上按预期工作。 这是int a[3]; int *p = a; int *q = &a[2]; //qp == 3 int a[3]; int *p = a; int *q = &a[2]; //qp == 3 int a[3]; int *p = a; int *q = &a[2]; //qp == 3有效。 但是,当我读到上面的q > p是UB。 我错过了什么?

对于指针,++与+ = 1相同吗?

我想重构我的一些旧C代码,我很好奇我是否可以用ptr += 1替换所有ptr++ ,其中ptr是一些指针,而不改变任何行为。 以下是K&R第5.3节中我的意思的一个例子: /* strlen: return length of string s*/ int strlen(char *s) { int n; for (n = 0; *s != ‘\0’; s++) n++; return n; } 当我用s += 1替换s++时,我得到了相同的结果,但我想知道所有类型是否都是这种情况。 我也对int进行了测试: int size = 10; int *int_array = (int*)calloc(size, sizeof(int)); for (int i = 0; i < size; i++) int_array[i] = i; […]

目标C:7 – 1 = 3?

NSLog(@”Before: %d”,currentArticle); currentArticle–; NSLog(@”SUBTRACT %d”,currentArticle); “currentArticle”是一个整数。 这只是在我的控制台中回显一次。 如果我不运行此减法,则数字“currentArticle”保持为7。 这是在主线程中运行,每个用户交互只运行一次。 我也试过了 currentArticle = currentArticle – 1; 结果相同。 我服用疯狂的药吗? 谢谢! 编辑: 声明如下: extern int *currentArticle; 稍后分配为: currentArticle = 0; 我尝试重写为: int *curArticle; // in my .h file curArticle = 1; 然后我跑了 curArticle–; 它仍然减少两个…… 我已经逐步完成了代码并确保没有其他调用这个变量。感谢您的反馈到目前为止,我会继续抨击它。

在C / C ++中向指针添加1个字节的正确方法是什么?

我现在用这个代码将指针移动1个字节,但我感​​觉不清楚…… int* a = (int*)malloc(sizeof(int)); void* b = ((char*)a)+1; char是1个字节,但没有为字节操作目的定义。 我相信还有另一种方法来执行此字节操作。 字节操作的正确方法是什么? PS。 我将示例代码修改为有效。 它现在用Clang编译为C ++。

char *的大小是否与int *的大小相同?

我知道:char *是一个指向char的指针。 和int *是指向int的指针。 所以,我想确认以下两件事: 所以现在假设我在32位机器上,那么这意味着内存地址是32位宽。 这意味着char *和int *的大小都是32位(4字节),对吧? char * *的大小也与int *的大小相同? 假设我有:int * ptr; 因此现在做*((char * *)ptr)= 0x154与*((int *)ptr)= 0x514相同,对吧? (0x514只是任意随机存储器地址) 平台:我在x86上。 PS:我知道类型转换不是建议的代码方式。 但我正在做内核编码,因此我必须做类型转换!