首页 文章

指向struct数组的指针

提问于
浏览
2

我试图理解下面的内容,这3个函数调用如何工作没有问题,我不确定它是如何在内部工作的,我可以理解第一个就好了,但第二次我用sizeof调用了malloc struct然后打印它,第三次我用结构指针的sizeof调用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 回答

  • 1
    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,几乎没有运行时错误检查 . 而不是立即崩溃你_1172263_ ed块 .

    缓冲区溢出是一种无声的杀手 . 谁知道你刚刚覆盖了什么?它可能是任何东西,真的 . 尝试释放pt2触发核心转储并不奇怪 . 指针错误在C中是令人讨厌的,因为通常你的程序会在最终崩溃之前跛行一段时间 . 崩溃的代码不一定是bug的地方 .

  • 3

    你没有为 pt2 分配足够的空间 . 该声明:

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

    只为结构的两个指针分配空间,没有足够的空间用于结构本身 .

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

相关问题