为什么我的代码会导致细分错误?

时间:2018-08-11 20:55:26

标签: c segmentation-fault

当我运行以下代码时,它显示“分段错误(核心已转储)”。你能帮我找出我犯的错误吗?

#include <stdio.h>

int str_len(char *s);

int main()
{

    int m;
    char a[] = "Hello, world";
    char *pa;
    *pa = a[0];
    m = str_len(pa);
    printf("The length of the string is %d.\n", m);
    return 0;

}

int str_len(char *s)
{

    int n;
    for (n = 0; *s != '\0'; s++)
            n++;
    return n;

}

2 个答案:

答案 0 :(得分:0)

代码错误:将字符字节分配给指针。从技术上讲可以,但是指针不包含有效地址。 错误继续进行,str_len认为它是一个字节而接收到该字符。尝试访问该无效地址可能会导致分段错误。 pa char指针未初始化。因此,*pa = a[0]就像是要说address_memory_for_pointers = a[0]。 尝试运行:

int m;
char a[] = "Hello, world";
char *pa = a;
m = str_len(pa);
printf("The length of the string is %d.\n", m);
return 0;

答案 1 :(得分:0)

使用带有数组名称的索引将始终引用该索引处特定元素的地址。

*pa = a[0];,这会将pa分配给数组a的第一个元素的地址,而不是整个数组的地址。如果要使*pa = a; or *pa = &a;指向整个数组,则应分配pa