【问题标题】:pointer reassignment gives segmentation fault指针重新分配导致分段错误
【发布时间】:2021-03-02 11:53:12
【问题描述】:

我在理解为什么我无法重新分配 lastPrefix 时遇到问题,在指定的行上它给了我一个段错误。我似乎遗漏了一些基本的东西。

char * somefunc(char ** strs, int numStrings)
{
    char * lastPrefix;
    printf("%d\n", *(strs[0]+0));
    printf("%d\n", *(strs[1]+0));
    printf("%d\n", *(strs[2]+0));
    printf("%d\n", *(strs[0]+1));
    printf("%d\n", *(strs[1]+1));
    printf("%d\n", *(strs[2]+1));
    printf("%d\n", *(strs[0]+2));
    printf("%d\n", *(strs[1]+2));
    printf("%d\n", *(strs[2]+2));
    printf("%d\n", *(strs[0]+0));
    printf("%d\n", *(strs[1]+0));
    printf("%d\n", *(strs[2]+0)); // ALL IS WELL
    *lastPrefix  = *(strs[1]+0);
    *lastPrefix  = *(strs[2]+0);
    *lastPrefix  = *(strs[0]+1);  // WILL SEGMENT FAULT HERE
    *lastPrefix  = *(strs[1]+1);
    *lastPrefix  = *(strs[2]+1);


}


int main()
{

    char * strs[] = {
        "flower", "flow", "flight"
    };
    
    char * res = somefunc(strs, SIZEOF(strs));
}

我也可以要求一个很好的 C 指针参考吗?

【问题讨论】:

  • *lastPrefix = *(strs[1]+0); 你正在取消引用 lastPrefix ,它没有指向有效的内存。

标签: c pointers double-pointer


【解决方案1】:

当你创建任何变量时,无论是指针还是数据,变量的初始值都会是一些垃圾或0。在你的情况下,

char *lastPrefix;

就是这样一个变量,里面包含了一些垃圾值。你必须使用malloc() 或类似的东西给它一个有效的值。否则,当您取消引用它时(*),它可能指向一些无法访问甚至不存在的内存位置。也许它指向您的代码的中间。也许它指向NULL。像这样的记忆在用户空间是无法访问的。所以,windows(或 linux)会杀死你的程序。

你想做什么:

char *lastPrefix;
lastPrefix=malloc(101);   //holds strings upto 100 characters

malloc() 将从堆中将值分配给您的变量,程序应该可以正常工作。 只记得最后释放内存:free(lastPrefix);

【讨论】:

    【解决方案2】:
    int *ptr; // pointer variable declaration */
    
    int kk; // actual variable declaration */
    
    *a = 11; //  `a` pointing to unknown memory address and accessing this will give segmentation fault/
    
    a = &kk; *a = 11 // This is valid. store address of `kk` in pointer variable  */
    

    同样,在您的代码中lastPrefix 指向一个未知地址,访问它会导致分段错误。

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多