C - 字符串数组(2D数组)和内存分配让我不必要的字符

时间:2013-06-04 15:07:56

标签: c arrays string memory-management multidimensional-array

我的任务有一个小问题。整个程序是关于树数据结构的,但我没有遇到任何问题。

我的问题是关于一些基本的东西:从用户输入读取字符串,然后将它们存储在数组列表中。

char str[1000];

fgets(str, 1000, stdin);

int x = 0;
int y = 0;
int z = 0;

char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

while(str[z] != '\n')
{
    list[x][y] = str[z];
    z++;

    if(str[z] == ',')
    {

        x++;
        y = 0;

        list = (char**)realloc(list, (x+1) * sizeof(char*));
        list[x] = (char*)malloc((y + 1)*sizeof(char));

        z++;
        if(str[z] == ' ') // Skips space after the comma
        {
            z++;
        }

    }
    else if(str[z] == '\n')
    {
        break;
    }
    else
    {
        y++;
        list[x] = (char*)realloc(list[x], (y+1)*sizeof(char));

    }

}

我将此列表数组传递给另一个函数。 例如,输入可能类似于

Abcde, Fghijk, Lmnop, Qrstu

我试图将这些单词分成数组 list

Abcde
Fghijk
Lmnop
Qrstu

当我尝试输出字符串时,我有时会产生奇怪的,过多的字符,如颠倒的问号和数字。

printf("%s ", list[some_number]);

让我

Fghijk¿

Fghijk\200

我的所有程序都按预期工作,除了这个我遇到问题的小问题。即使具有相同的确切输入,也可能出现或不出现错误。我猜它与内存分配有关吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

你需要在新字符串的末尾加上'\ 0'。

答案 1 :(得分:2)

查看大多数C库函数,例如printfstrlen进程字符串,假设\0为所有的结束字符。否则,他们继续读取超出内存的内存或导致内存违规或获取某些值0并停止,并且内存中的所有字节都被解释为其extended ascii等效,因此您正在变得如此奇怪的行为。

因此,为\0字符分配一个额外字节并将其分配给最后一个字节。

答案 2 :(得分:0)

将变量初始化为null,或者如番茄所说,在新字符串的末尾添加一个空字符。

在内存管理方面,C缺乏许多程序员现在认为理所当然的。你在malloc的正确路径上,但该功能只分配内存...它不会清除它。因此,您的变量将具有正确的空间量(对于减少内存泄漏和溢出错误至关重要),但将填充垃圾。垃圾可能是任何东西,在你的情况下,这是一个颠倒的问号。适当的,你不觉得吗?

我可能会弄错,因为我无法在没有更多信息的情况下自行运行代码,但是在

之后
char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

陈述,你会想做这样的事情:

list = NULL;

等清除垃圾。

此外,您可能需要使用strlen()函数(包含在string.h中)来确定需要分配多少内存块。

清除用于变量的空间是一个很好的做法,以便与C一起学习。很高兴看到你也学习它。