【发布时间】:2016-10-05 23:23:46
【问题描述】:
我有一个独特的情况,我试图在结构成员中存储一个 4096 字符串。但是,我为较短的字符串分配了通常的内存量,但仍然出现 valgrind 错误:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct List {
char * name;
int grade;
struct List * next;
};
int main(void) {
struct List * newList;
char * bigString;
int i;
bigString = malloc(sizeof(char)* 4096);
for (i=0; i<4096; i++)
bigString[i] = 'a';
newList = malloc(sizeof(struct List));
newList->next = NULL;
newList->name = malloc(strlen(bigString)+1);
free(bigString);
free(newList->name);
free(newList);
return 0;
}
行:
newList->name = malloc(strlen(bigString)+1);
返回错误Invalid read of size 1
但是等一下,我正在分配字符串的长度,加上 1 作为空终止符,这是怎么回事?
其实我什至试过这个:
newList->name = malloc(sizeof(char) * strlen(bigString) +1);
我什至尝试在 malloc 调用后终止字符串:
newList->name[strlen(bigString)] = '\0';
无济于事..
我实际上对我在这里做错了什么感到非常困惑。有什么想法吗?
【问题讨论】:
-
bigString = malloc(sizeof(char)* 4096);-->bigString = malloc(sizeof(char)* 4096+1); bigString[4096] = 0; -
返回大小为 1 的无效写入:/
-
你换
i<4096了吗? -
是的,没关系,现在可以了。