C语言 不明白为什么段错误



我想前段时间我尝试了以下代码,一切都很顺利。但是现在,我有一个分段错误,我无法找出哪个部分提供了它。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char *test = NULL; // Empty string
    char *a = "programming test";
    int i = 0;
    /* While the string "a" does not encounter a space,
       I put its characters in the empty string "test" one by one. */
    while(a[i] != ' ') {
        test[i] = a[i];
        i++;
    }
    printf("%sn", test);
    return 0;
}

这个小代码对我来说似乎是正确的,我无法确定出了什么问题。

您在此处没有分配内存:

char *test = NULL; // Empty string

给它一些记忆:

char *test = malloc(sizeof(char) * 50);

循环后nul终止它:

while(a[i] != ' ') {
    test[i] = a[i];
    i++;
}
test[i] = '';
printf("%sn", test);

你已经得到了问题的答案,但其他答案错过了告诉你的是,你的问题的答案

不明白为什么段错误

是由于代码产生的未定义行为

在您的代码中,您已使用 NULL 初始化了test

char *test = NULL; // Empty string

稍后,如果不将内存分配给test,您正在尝试取消引用相同的内存。

test[i] = a[i];

这会产生未定义的行为。

摘自C11标准文档第6.5.3.2章,地址和间接寻址运算符,第4段,

[...]如果 已为指针分配了无效值,则未定义一元 * 运算符的行为。

及相关脚注(102(

在一元 * 运算符取消引用指针的无效值中,有一个空指针,即 地址与指向的对象类型以及对象地址在 其生命周期结束。

众所周知,数组下标运算符[]unary *运算符(*p=== p[0] realtion(的变体,该规则适用于相同的规则。

所以,基本上,这里你取消引用一个NULL指针,创建未定义的行为。

请记住:>>分段错误是具有未定义行为的副作用之一


若要解决此问题,应在取消引用指针之前将内存分配给指针。

此外,同样值得一提的是,字符串应始终以 null 结尾。

也就是说,您应该使用 int main(void) 作为函数签名。这是标准推荐的。

char * test=NULL;

未将任何内存分配给指针 test 。您正在引用NULL所以它会导致分段错误。

因此,为test分配内存。

 test=malloc(50);// memory you need.

相关内容

  • 没有找到相关文章

最新更新