【问题标题】:calloc / malloc and read weird behavior?calloc / malloc 并读取奇怪的行为?
【发布时间】:2012-01-09 04:05:41
【问题描述】:

我试图保留一个动态分配的字符串数组,这些字符串是使用 c 中的 read 系统调用读取的。这是我正在尝试做的一个小样本:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void processInput() {
    char ** array = (char **) calloc(20, sizeof(char*));
    int arrayIndex = 0;
    while(1) {
        printf("Type something: ");
        fflush(stdout);

        char* buffer;
        int readResult = read(0, buffer, 100);

        array[arrayIndex] = (char*)calloc(readResult, sizeof(char));
    }
}    

但是,这会导致一些奇怪的问题:

输入一些东西:a 输入一些东西:输入一些东西:a 输入一些东西:输入一些东西:abcdefg 输入某事:输入某事:输入某事:输入某事:输入某事:输入某事:输入某事:输入某事:

对此有什么解释吗?我似乎无法弄清楚为什么会这样。

【问题讨论】:

  • char* buffer; readResult = read(0, buffer, 100); 使用未初始化的变量——尤其是未初始化的指针——只能以泪水收场。
  • 你没有增加arrayIndex
  • 对不起,这个例子有点草率。你说得对,我没有增加arrayIndex,但这对这个例子并不重要。但是,实际上您 100% 正确地认为需要增加 arrayIndex。否则,除了索引 0 中最后添加的项目之外,它不会存储任何内容:P。
  • 为什么要删除代码?问题现在无法回答,可能会被关闭...
  • 我已经回滚到带有代码的修订版。 Ryan:请不要破坏你的问题。一旦有了答案,您就有责任将问题留在与答案相关的表格中。如果您需要修改问题,请务必编辑它,但保留原始材料可见。

标签: c dynamic-memory-allocation system-calls


【解决方案1】:

替换:

char *buffer;

与:

char buffer[100];

维度与read()的参数一致,但你的字符串不会以read()为空终止,所以你可能更喜欢分配101个字节来强制空终止它。分配空间时需要考虑额外的字节。

注意分配的空间没有被使用。

您应该始终在使用内存分配之前对其进行错误检查。

由于您只在循环之前分配了 20 个指针,while (1) 循环很危险,如果用户输入超过 20 行数据,您可能会踩踏超出分配的空间。

(请注意,如果用户从文件重定向输入,您将不会读取 20 行;您将在 20 个 100 个字符的块中读取 2000 个字符,换行符和所有字符,然后运行到崩溃区域。)

【讨论】:

    【解决方案2】:

    从查看您的输出来看,它看起来像是在输入中的每个字符的循环中运行。

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 2015-06-05
      • 2011-01-21
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多