【问题标题】:Malloc error - can't assign to variable sized objectMalloc 错误 - 无法分配给可变大小的对象
【发布时间】:2021-05-11 01:04:12
【问题描述】:

对于下面的 malloc 语句,我无法初始化可变大小的对象

int textsize = BUF_SIZE;
  char *lines[textsize] = malloc(sizeof(char *) * textsize);

目标是拥有一个指针数组,每个指针将存储指向用户输入的 STDIN 行的指针。 textsize 是用户输入支持的行数。

错误:

error: variable-sized object may not be initialized
    char *lines[textsize] = malloc(sizeof(char *) * textsize);

【问题讨论】:

  • 您正在尝试动态分配您已经静态分配的数组。 char **lines = malloc(sizeof(char *) * textsize);

标签: c pointers memory malloc


【解决方案1】:

这是因为您已经分配了 textsize 作为大小的行:- 静态,然后您尝试使用 malloc 动态分配.. 试试双指针

char **lines = malloc(...)

【讨论】:

  • 问题在于,稍后在代码下游我这样做: while ((line = fgets(text, BUF_SIZE, stdin)) != NULL) { lines[linecount] = line; ++行数;它将在每次迭代中覆盖行[]。我希望能够保存来自命令提示符的所有句子。
  • 替换是因为你使用'='这将使lines[linecount]指向line,'line'会随着while循环而改变,你可以使用strcpy() strcpy(lines[ linecount], line) 这里是代码示例:-
  • while ((textbuff = fgets(textbuff, textsize, stdin)) != NULL) { if(textbuff[0] == '\n'){ break; } line[linesCount] = (char *)malloc(sizeof(char *) * strlen(textbuff)); strcpy(line[linesCount], textbuff);线数++; }
【解决方案2】:

正如@A.Shenoy 提到的,您应该使用双指针。原因是当您执行char *lines[textsize] 时,您正在创建一个指向 char 数组的指针,但 malloc 返回一个 char 指针。所以解决方案是做char **lines,它创建一个指向char指针的指针。您仍然需要为指针分配空间,这就是您可以初始化数组的方式;

#define ARRAY_SIZE 5 // array of 5 strings

char **lines = (char**) malloc(sizeof(char*) * ARRAY_SIZE);
int i;
for (i = 0; i < ARRAY_SIZE; i++) {
  lines[i] = (char*) malloc(sizeof(char) * textsize);
}

// The array is now allocated, and you can fill it with strcpy

// Example for filling:
char text[] = "Hello World!";
strcpy(lines[0], text);

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2021-12-12
    • 2014-02-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多