程序崩溃时使用char*

kun*_*l18 1 c c++ string pointers

在运行以下代码时,我的程序意外崩溃!

#include<stdio.h>
#include<string.h>

int main(){

    char *str = NULL;
    strcpy(str, "swami");
    printf("%s", str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但如果我喜欢这样:

#include<stdio.h>
#include<string.h>

int main(){

    char *str;
    strcpy(str, "swami");
    printf("%s", str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码工作正常并生成正确的输出!

我正在使用gcc编译器(codeblocks IDE).此外,这两个代码都会导致DevCpp中的程序崩溃.任何人都可以解释一下为什么会这样!?

Mih*_*eac 23

你不能写NULL指针.

在第二种情况下,您的指针被随机初始化为程序内存中的有效位置.这就是为什么你可以做到这strcpy一点.

改变两个程序

str = malloc(size)
Run Code Online (Sandbox Code Playgroud)

或者calloc之前的选项strcpy.(size是您要保留的空间大小.)

根据评论,您还可以将声明更改strchar str[6](或更多).

最后编辑:我将向您展示显示程序内存和指针的图片:

在此输入图像描述

灰色区域和红色区域是禁止的(您不能写入或读取它们;顶部灰色区域用于内核内存,而其他区域是尚未回收的空间).底部的红色区域是特殊的0页面.因为NULL0str = NULL将指向这一点,你的程序将失败.

如果你没有指定任何东西,str它最终会随机指向.它仍然可以指向红色区域或灰色区域 - >您的程序将失败.它可以指向绿色或蓝色(两个色调)区域,使您的程序工作(除了它指向只读位置并且您写入它的情况).指针的分配区域使其指向绿色区域,将其放大到顶部.

另一种选择,str[6]将堆栈区域放大到底部.所有的局部变量都预留空间进栈,而所有空间分配malloc,realloc,calloc和其他朋友进入堆.

最后,看看一个博客文章有关的区别char[]char *.

PS:如果你想使用GNU扩展,你可以查看该asprintf功能.它会为字符串分配空间并在那里写一些内容:

asprintf(&str, "swami");
Run Code Online (Sandbox Code Playgroud)

要么

asprintf(&str, "%d + %d == %d\n", 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要便携性,那么您将远离此功能.