我有一个独特的情况,我试图在一个结构体成员中存储一个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后null终止字符串:
newList->name[strlen(bigString)] = ' ';
To no avail.
我真的不知道我在这里做错了什么。什么好主意吗?
bigString
本身不是null终止的,因此strlen(bigString)
导致试图读取超过分配给bigString
的空间的末尾。
您忘记在BigString
后面添加