2012-01-09 87 views
-2

我想保留一个动态分配的字符串数组,使用c中的读系统调用读入。这里是什么,我试图做一个小样本:calloc/malloc并读取奇怪的行为?

#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)); 
    } 
}  

然而,这会导致一些奇怪的问题:

 

    Type something: a 
    Type something: Type something: a 
    Type something: Type something: abcdefg 
    Type something: Type something: Type something: Type something: Type something: Type something: Type something: Type something: 

有没有做任何解释?我似乎无法弄清楚为什么会发生这种情况。

+3

'char * buffer; readResult = read(0,buffer,100);'使用未初始化的变量 - 特别是未初始化的指针 - 只能以泪结束。 – 2012-01-09 04:08:55

+1

你并没有递增'arrayIndex' – Kevin 2012-01-09 04:13:41

+0

不好意思,这个例子有点草率。你是正确的,我没有增加arrayIndex,但它不是重要的例子。但是,在实践中,你需要增加arrayIndex是100%正确的。否则,它不会存储索引0中最后添加的项目:P。 – Ryan 2012-01-09 04:17:09

回答

2

替换:

char *buffer; 

有:

char buffer[100]; 

尺寸与参数read()一致的,但你的字符串不会被read()被空值终止的,所以你可能更愿意分配101字节,而不是强制终止它。分配空间时需要考虑额外的字节。

请注意,未使用分配的空间。

在使用它们之前,应该总是检查内存分配。

由于您只在循环之前分配20个指针,因此while (1)循环很危险,并且如果用户输入的数据超过20行,可能会使您践踏得超出分配的空间。 (请注意,如果用户重定向来自文件的输入,则不会读取20行;您将在包含100个字符,换行符和全部的20个块中读取2000个字符,然后运行到崩溃区域。 )

0

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