valgrind 抱怨:大小 8 的无效写入,在 malloc 上
valgrind complains: Invalid write of size 8, On malloc
我无法弄清楚,为什么我在 运行 Valgrind 时看到这个错误。
struct char_ctx {
int arr_size;
char **char_array;
};
void char_compile() {
struct char_ctx *ctx = malloc(sizeof(struct char_ctx*));
ctx->char_array = malloc((100) * sizeof(char *)); // I see error with this.
char **y = malloc((100) * sizeof(char *)); // I dont see error with this.
ctx->arr_size = 100;
}
int main(int ac, char **av)
{
char_compile();
return 0;
}
Valgrind 输出
==30585== Invalid write of size 8
==30585== at 0x108671: char_compile (temp.c:54)
==30585== by 0x1086A8: main (temp.c:63)
==30585== Address 0x522f048 is 0 bytes after a block of size 8 alloc'd
==30585== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30585== by 0x10865B: char_compile (temp.c:53)
==30585== by 0x1086A8: main (temp.c:63)
代码正确执行。
我在 ctx->char_array
上看到错误,但是当我使用 char **y
时,我没有看到错误。
问题出在这一行:
struct char_ctx *ctx = malloc(sizeof(struct char_ctx*));
您只为指向 struct char_ctx
的指针分配 space,而不是 struct char_ctx
。因此,写入 ctx->char_array
会超出分配内存的末尾。
你反而想要:
struct char_ctx *ctx = malloc(sizeof(struct char_ctx));
或者更好:
struct char_ctx *ctx = malloc(sizeof *ctx);
我无法弄清楚,为什么我在 运行 Valgrind 时看到这个错误。
struct char_ctx {
int arr_size;
char **char_array;
};
void char_compile() {
struct char_ctx *ctx = malloc(sizeof(struct char_ctx*));
ctx->char_array = malloc((100) * sizeof(char *)); // I see error with this.
char **y = malloc((100) * sizeof(char *)); // I dont see error with this.
ctx->arr_size = 100;
}
int main(int ac, char **av)
{
char_compile();
return 0;
}
Valgrind 输出
==30585== Invalid write of size 8
==30585== at 0x108671: char_compile (temp.c:54)
==30585== by 0x1086A8: main (temp.c:63)
==30585== Address 0x522f048 is 0 bytes after a block of size 8 alloc'd
==30585== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30585== by 0x10865B: char_compile (temp.c:53)
==30585== by 0x1086A8: main (temp.c:63)
代码正确执行。
我在 ctx->char_array
上看到错误,但是当我使用 char **y
时,我没有看到错误。
问题出在这一行:
struct char_ctx *ctx = malloc(sizeof(struct char_ctx*));
您只为指向 struct char_ctx
的指针分配 space,而不是 struct char_ctx
。因此,写入 ctx->char_array
会超出分配内存的末尾。
你反而想要:
struct char_ctx *ctx = malloc(sizeof(struct char_ctx));
或者更好:
struct char_ctx *ctx = malloc(sizeof *ctx);