【问题标题】:Why does my code cause a Segmentation fault?为什么我的代码会导致分段错误?
【发布时间】:2018-08-11 20:55:25
【问题描述】:

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

#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;

}

【问题讨论】:

    标签: c segmentation-fault


    【解决方案1】:

    代码错误:将字符字节分配给指针。技术上没问题,但指针不包含有效地址。 错误继续,str_len 接收到认为它是一个字节的字符。尝试访问该无效地址可能会导致分段错误。 pa 字符指针未初始化。因此,*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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-08-18
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多