【问题标题】:Invalid read of Size 1 when mallocing large String分配大字符串时读取大小为 1 的无效
【发布时间】: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&lt;4096了吗?
  • 是的,没关系,现在可以了。

标签: c string malloc


【解决方案1】:

bigString 本身不是以空值结尾的,因此strlen(bigString) 会导致尝试读取分配给bigString 的空间末尾。

【讨论】:

    【解决方案2】:

    您忘记在BigString 末尾添加\0

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 2015-03-17
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多