2


目前,我尝试理解 C 中的动态数组。当我为指针“ptr”分配内存时,它可以在不输入我需要的元素数量(在 malloc 函数中)的情况下工作。
现在,问题是,不明白它为什么起作用。
如果有人能给我一些建议,那就太好了。谢谢。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct daten
{
    char name[20];
    int alter;
};

int main(void)
{
    struct daten *ptr;
    int i;

    ptr = malloc(sizeof(struct daten *)); //works fine!!
    //ptr = malloc(sizeof(struct daten *)*4);
    strcpy(ptr[0].name, "Daniel");
    ptr[0].alter = 23;

    strcpy(ptr[1].name, "Fabian");
    ptr[1].alter = 29;

    strcpy(ptr[2].name, "Helmut");
    ptr[2].alter = 34;

    strcpy(ptr[3].name, "Katrin");
    ptr[3].alter = 21;

    for(i = 0; i<4; i++)
    {
        printf("%s\t", ptr[i].name);
        printf("%d\n", ptr[i].alter);

    }

    return 0;
}
4

5 回答 5

2

由于这是一种未定义的行为,任何事情都可能发生:您的程序可能运行良好。但这并不意味着它是一个正确的程序。

因此,您必须分配足够的内存来执行此操作,即sizeof(struct daten) * 4字节。

于 2013-01-13T16:37:01.463 回答
2

关键字是它不能“正常工作”。最多它似乎在工作。

您在这里拥有的是未定义的行为(因为您正在为一个结构分配空间,但是,您正在写入更大的空间)。未定义的行为可以做任何事情;这并不意味着程序必须崩溃。这包括它可能“工作正常”。

此外,您误解了应该分配多少内存。对于T分配给 type 指针的 type T *sizeof(T)应该分配字节,如下所示:

ptr = malloc(sizeof(struct daten) * 4);

更好的是:

ptr = malloc(sizeof(*ptr) * 4);
于 2013-01-13T16:37:41.173 回答
0

这是未定义的行为。你只是(不)幸运的是它的工作。如果你在不同的系统上尝试这个,它可能会也可能不会。

你应该做 :

ptr = malloc(sizeof(struct daten)*4);

操作成功,因为数据可能在分配空间之后被写入内存。由于这是未分配的空间,因此您没有任何问题,它是working. 当您尝试使用此空间时,您也会遇到问题。

于 2013-01-13T16:37:58.060 回答
0

嗯,你只是写到未分配的区域。这可以工作,但从长远来看,您会遇到崩溃,因为您的堆很可能会因写入未分配的区域而损坏,因此连续的 malloc 可能会失败或使您的程序崩溃。

于 2013-01-13T16:39:51.467 回答
0

ptr[3]也可以表示为*(ptr + 3),其中 '3' 缩放为(3 * sizeof(*p))。因此,它将数据复制到超出您分配的内存的某个内存位置。

你很幸运,或者我应该说你很不幸。你所做的有点像随意刺伤某人,你可能会击中一个重要器官,也可能不会。这次你没有,编译代码而不调试(例如)来改变内存布局,你可能会遇到一些会杀死进程的东西。或者也许不杀死它,而只是伤害它。

您已经遇到了必须遵守 C 语言编程的原因之一。不,它没有“工作”,你的测试不足以证明它失败了。

另请参阅calloc

于 2013-01-13T16:43:18.490 回答