繁体   English   中英

为什么即使我没有为它分配内存也能工作?

[英]Why does gets work even when I have not allocated memory to it?

我最近在 SO 中回答了一个问题,问题是输入几句代码并打印出来。 我的代码是这样的:

#include<stdio.h>  

int main() {
    clrscr();
    int line, i;

    char (*string)[100];
    printf("How many line?\n");
    scanf("%d",&line);
    getchar();

    for(i=0;i<line;i++) {
        gets(string[i]);
    }

    printf("You entered:\n");
    for(i=0;i<line;i++) {
        puts(string[i]);
    }

    return 0;
}

如您所见,我没有为单个字符串分配任何内存,即s[0]s[1] ,......但令人惊讶的是,我的编译器没有给我任何警告或错误,它完美地工作。

所以我发布了这段代码,坦率地说,它得到了很多反对(我知道我应得的)。 你能解释一下为什么这段代码有效而不给出分段错误吗?

我的输出如图所示:

输出

char (*string)[100];

好的, string代表一个指向 100 char的指针,但它没有被初始化。 因此,它代表一个任意地址。 (更糟糕的是,在后续访问时,它甚至不一定代表相同的任意地址。)

gets(string[i]);

嗯,这将数据从标准输入读取到从随机地址开始的内存块,加上i*100 ,直到读取 NUL 字节。

不是很健壮。 也不保证会产生错误。 如果您没有得到,则随机地址必须已映射到可写字节。

如您所见,我没有为单个字符串分配任何内存,即s[0]s[1]但令人惊讶的是我的编译器没有给我任何警告或错误,并且它完美地工作。

是时候降低您的期望,或者提高编译器的诊断级别。 尝试-Wall -Wextra ,如果它采用那种风格的选项。 应该警告您使用string没有先初始化。 该警告gets已被弃用,也将是一个不错的主意,但我的编译器并没有提到它。

C 和 C++ 允许您自己管理内存。 您负责验证指针。 在 C 中,这是问题的主要来源。

在 C++ 中,解决方案是使用指针的替代方法,例如引用(不能未初始化)和智能指针(为您管理内存)。 尽管该问题被标记为 C++ 并编译为 C++ 程序,但它并不是以称为 C++ 的风格编写的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM