我试图理解以下内容,这3个函数呼叫如何无问题,我不确定它在内部的工作原理,我能理解第一个很好,但是第二次用结构的大小打电话给malloc,然后打印它,第三次我用结构指针和也打印。两者都可以毫无问题地工作?第二个Malloc分配了2*2*int = 16字节的大小,第三个malloc分配为2*指针= 8。而且,我在尝试释放PT2时会得到核心转储,这是在Linux上使用C&gcc
#include<stdio.h>
#include<stdlib.h>
struct test{
int field1;
int field2;
};
struct test func(int a, int b) {
struct test t;
t.field1 = a;
t.field2 = b;
return t;
}
int main()
{
struct test t;
struct test pt[2];
pt[0] = func(1,1);
pt[1] = func(2,2);
printf("%d %dn", pt[0].field1,pt[0].field2);
printf("%d %dn", pt[1].field1,pt[1].field2);
printf("n");
struct test *pt1;
pt1 = malloc(sizeof(struct test) * 2);
pt1[0] = func(2,2);
pt1[1] = func(3,3);
printf("%d %dn", pt1[0].field1,pt1[0].field2);
printf("%d %dn", pt1[1].field1,pt1[1].field2);
printf("n");
struct test *pt2;
pt2 = malloc(sizeof(struct test*) * 2);
pt2[0] = func(4,4);
pt2[1] = func(5,5);
printf("%d %dn", pt2[0].field1,pt2[0].field2);
printf("%d %dn", pt2[1].field1,pt2[1].field2);
free(pt1);
free(pt2);// I'm getting core dump when trying to free pt2
}
输出低于
1 1
2 2
2 2
3 3
4 4
5 5
pt1 = malloc(sizeof(struct test) * 2);
此语句是正确的。
pt2 = malloc(sizeof(struct test*) * 2);
此语句是错误的。它在sizeof
表达式中使用了错误的类型,因此分配了错误的内存量。使用sizeof(*var)
而不是sizeof(type)
以避免此问题是普遍的做法。
pt2 = malloc(sizeof(*pt2) * 2);
在像您这样的32位平台上,有故障的malloc仅分配所需的内存量的一半,因此分配给p2[1]
调用不确定的行为。您的程序将其写入内存不拥有。这是C,几乎没有运行时错误检查。而不是立即崩溃,您通常会覆盖Malloc'Ed块旁边的记忆中发生的任何事情。
缓冲区超支是一个沉默的杀手。谁知道你刚刚掩盖了什么?真的可以是什么。试图释放PT2触发核心转储也就不足为奇了。指针错误在C中令人讨厌,因为您的程序常常会在最终崩溃之前li行。崩溃的代码不一定是错误的位置。
您没有为pt2
分配足够的空间。语句:
pt2 = malloc(sizeof(struct test*) * 2)
只是将两个指针的空间分配给结构,没有足够的空间来使结构本身。
您正在编写pt2
数组的边界。这是不确定的行为,在您的情况下,会导致free
崩溃。如果这是一个更复杂的程序的一部分,则这种类型的问题可能会导致不同的内存损坏...