指向struct数组的指针

时间:2012-12-20 02:51:46

标签: c linux malloc

我试图理解下面这三个函数调用如何正常工作, 我不确定它是如何在内部工作的,我可以理解第一个就好了,但第二次我用结构的size调用malloc然后打印它,第三次我用结构的指针大小调用malloc也打印出来。两者如何工作没有问题? 第二个malloc分配2 * 2 * int = 16个字节的大小,第三个malloc分配为2 * pointer = 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 %d\n", pt[0].field1,pt[0].field2);
printf("%d %d\n", 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 %d\n", pt1[0].field1,pt1[0].field2);
printf("%d %d\n", 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 %d\n", pt2[0].field1,pt2[0].field2);
printf("%d %d\n", 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

2 个答案:

答案 0 :(得分:3)

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中是令人讨厌的,因为通常你的程序会在最终崩溃之前跛行一段时间。崩溃的代码不一定是bug的地方。

答案 1 :(得分:1)

您没有为pt2分配足够的空间。声明:

pt2 = malloc(sizeof(struct test*) * 2)

只为结构分配两个指针的空间,没有足够的空间容纳结构本身。

你正在写过pt2数组的边界。这是未定义的行为,在您的情况下会导致free崩溃。如果这是一个更复杂的程序的一部分,这种类型的问题可能会导致不同类型的内存损坏......