关于指向固定数组的指针的困惑

时间:2016-03-23 22:56:05

标签: c pointers malloc

请考虑以下示例:

malloc

上面的代码不正确,因为t.p = malloc(2 * sizeof(char *)); 没有为索引为1的元素分配足够的内存。这在valgrind下运行时可以看到。当我将malloced内存量加倍时:

t.p = malloc(4 * sizeof(char *));

为:

TestID TestResult1 TestResult2.. TestCount 
12         1         1             1
12         2          2            2
13         4         1             1

valgrind输出不再显示内存错误。

我理解错误的原因但是我无法看到我应该如何计算malloc调用所需的内存。

感谢。

已编辑:示例代码

1 个答案:

答案 0 :(得分:1)

t.p是一个指向20 char数组的指针:你在程序中访问2个这样的数组,因此你应该为它们分配40个字节。

有一种更简单的方法:将对象p的大小分配给数组中元素数量的次数:

t.p = malloc(sizeof(*t.p) * 2);

这样,如果您更改struct test_t的定义,malloc分配的金额会自动调整。

请注意,您的陈述是多余的:

memset(&t, 0, sizeof(test));

可以简化为test t = { NULL };t.p = NULL;,甚至完全省略,因为malloc会设置t.p的值。

strcpy(t.p[0], "hello");
t.p[0][strlen("hello")] = '\0';  // useless: the '\0' was alread set there by strcpy

strcpy(t.p[1], "world");
t.p[1][strlen("world")] = '\0';  // useless: the '\0' was alread set there by strcpy

整个代码可以简化为:

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

typedef struct test_t {
    char (*p)[20];
} test;

int main(int argc, char **argv) {
    test t;

    t.p = malloc(sizeof(*t.p) * 2);

    strcpy(t.p[0], "hello");
    strcpy(t.p[1], "world");

    printf("[%s]\n", t.p[0]);
    printf("[%s]\n", t.p[1]);

    free(t.p);
    return 0;
}