c++ - 使用 char* 时程序崩溃

标签 c++ c string pointers

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

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

int main(){

    char *str = NULL;
    strcpy(str, "swami");
    printf("%s", str);
    return 0;
}

但如果我这样做:

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

int main(){

    char *str;
    strcpy(str, "swami");
    printf("%s", str);
    return 0;
}

此代码运行良好并生成正确的输出!

我正在使用 gcc 编译器(codeblocks IDE)。此外,这两种代码都会导致 DevCpp 中的程序崩溃。谁能解释一下为什么会这样!?

最佳答案

您不能写入 NULL 指针。

在第二种情况下,碰巧你的指针被随机初始化到程序内存中的一个有效位置。这就是为什么您可以对它执行 strcpy 的原因。

把两个程序都改成

str = malloc(size)

strcpy 之前带有 calloc 的选项。 (size 是您要保留的空间的大小。)

根据评论,您还可以将 str 的声明更改为 char str[6](或更多)。

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

enter image description here

灰色区域和红色区域是禁止的(您不能对它们进行写入或读取;顶部灰色区域用于内核内存,而其他区域是尚未回收的空间)。底部的红色区域是特殊的0页。由于 NULL0,您的 str = NULL 将指向它,您的程序将失败。

如果您不为 str 分配任何内容,它将最终随机指向。它仍然可以指向红色区域或灰色区域 -> 您的程序将失败。它可以指向绿色或蓝色(两种色调)区域,使您的程序运行(除非它指向只读位置并且您写入它)。为指针分配区域使其指向绿色区域,将其放大到顶部。

另一个选项,使用 str[6] 将堆栈区域扩大到底部。所有局部变量都保留在堆栈中,而所有使用 mallocrealloccalloc 和其他 friend 分配的空间都进入堆。

最后,看看 blog article char[]char * 的区别

PS:如果您想使用 GNU 扩展,您可以查看 asprintf 函数。它会为一个字符串分配空间并在那里写入一些内容:

asprintf(&str, "swami");

asprintf(&str, "%d + %d == %d\n", 1, 2, 3);

但是,如果你想要可移植性,你会远离这个功能。

关于c++ - 使用 char* 时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482465/

相关文章:

c# - 字符串的按位运算 - 1440 个字符长度

c - 麻烦在c中声明一个全局字符串数组

c++ - 在 Visual Studio 中使用增强测试

c++ - 如何在 C++ Makefile 中链接多个 .so 文件

c++ - 使用 OpenCV 围绕一个点旋转一个点

c++ - 使用双向链表实现稀疏矩阵中的多项式

c - 在 C 中使用 libtar 库

无法从 TextView 获取 GtkTextBuffer - C、GTK3

c++ - 在旧式 main() 的参数中分解 WinMain 的 cmdLine

string - 如何将 unicode 字符串附加到 Julia 中的字符串列表?