2

我正在刷新我的 C 技能。我正在使用 char *s 并使用 malloc 为 s 分配内存。然后使用scanf,我将输入读取到s。但我的问题是我没有指定内存块的大小。但该程序有效。如何为任意长度的输入字符串分配内存?scanf 是否只是增加指针并将数据写入该位置?

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

int main() {
    char *s;
    s = (char *) malloc(sizeof(s));    //I did not specify how much like malloc(sizeof(s) * 128)
    if (s == NULL) {
        fprintf(stderr, "\nError allocating memory for string");
        exit(1);
    }
    scanf("%s", s);
    puts(s);
    free(s);
    return 0;
}

/*
    Input:
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Output:
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
*/
4

6 回答 6

4

With char *s;,与 4 或 8sizeof(s)相同,sizeof(char *)具体取决于您使用的是 32 位盒还是 64 位盒。

如果你在一个 32 位的盒子上,那么你可以存储 3 个字符加上空的“字符串结尾”字符。如果您存储更多,它可能会爆炸。

于 2012-10-23T04:25:06.937 回答
1

sizeof(s)s返回类型为 的字节大小char*。通常在 32 但机器上这是 4 字节和 64 位机器上的 8 字节。因此,您实际上已经告诉 malloc 要分配的字节数,s并将指向该内存区域。

于 2012-10-23T04:22:09.457 回答
1

您确实指定了大小:sizeof(s)。由于schar *, sizeof(s) == sizeof(char *). 根据您的平台,这可能是 4 或 8 个字节的长度。

因此,您有效地分配了 4(或 8)个字节来存储字符串。如果您在命令行上键入超过 3 个(或 7 个)字符,那么您将开始写入超出分配数组的末尾,这会触发未定义的行为。对于未定义的行为,任何事情都可能发生:您的程序可能看起来工作正常,程序可能会用 ZALGO 填充其余内存,程序可能会出现可怕的段错误,或者您可能会遇到流行的鼻恶魔。C 规范没有说明会发生什么(因此称为“未定义行为”)。

您的程序“工作”的事实完全是侥幸,永远不应依赖

于 2012-10-23T04:32:03.280 回答
1

sizeof(s)是否返回字符指针的大小,取决于您是在 32 位还是 64 位平台上运行,它将是 4 字节还是 8 字节。

你想sizeof(*s)改用。但是,由于 C 标准指定sizeof(char)(这sizeof(*s)将是)是一,因此对于字符数组,您不需要它。

于 2012-10-23T04:55:30.860 回答
0

它只会allocate the space=size of char *而不是简单地增加指针并将数据写入该位置?正如你所想。

它为什么起作用的答案是:因为它把它写在没有分配给你的内存区域上,但是如果该区域被其他进程保留,你的程序就会崩溃。所以最好分配更大的空间。

于 2012-10-23T04:22:45.323 回答
0

您只分配大小等于大小的内存Integer。如果您将更长的字符串写入此变量,它只会覆盖现有的内存位置,并且您的程序将显示意外行为。

于 2012-10-23T04:25:01.413 回答