请考虑以下示例:
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调用所需的内存。
感谢。
已编辑:示例代码
答案 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;
}