mallocing大型String时读取大小1的读取无效

时间:2016-10-05 23:23:47

标签: c string malloc

我有一个独特的案例,我试图在结构成员中存储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为null终止符,这里发生了什么?

事实上我甚至试过这个:

newList->name = malloc(sizeof(char) * strlen(bigString) +1);

哎呀我甚至试图在malloc调用后终止字符串:

newList->name[strlen(bigString)] = '\0';

无济于事..

我实际上对于我在这里做错了什么感到困惑。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

bigString本身不会以空值终止,因此strlen(bigString)会导致尝试读取为bigString分配的空格的末尾。

答案 1 :(得分:1)

您忘记在\0的末尾添加BigString