代码之家  ›  专栏  ›  技术社区  ›  Luke Rossenvalden

在main()中声明的指针上使用malloc的函数

  •  0
  • Luke Rossenvalden  · 技术社区  · 5 月前

    我研究了许多关于这个主题的类似问题,但大多数问题似乎都集中在作为参数传递给函数的指针上,而不是指针的地址,所以还没有找到我的答案。

    11号线发生分段故障。为什么?

    干杯。

    void allocateMem(int **ptr)
    {
        int i = 0 ;
    
        *ptr = malloc(100 * sizeof(int)) ;
    
        if(*ptr != NULL)
        {
            for(i = 0 ; i < 100 ; i ++)
            {
                *ptr[i] = i ;                //segfault
                printf("%d %d\n" , i , *ptr[i]) ;
            }
    
            free(*ptr) ;
        }
    
        else
            exit(0) ;
    }
    
    int main(int argc , char *argv[])
    {
        int *ptr = NULL ;
    
        allocateMem(&ptr) ;
    
        return 0 ;
    }
    
    1 回复  |  直到 5 月前
        1
  •  2
  •   Chris    5 月前

    这是一个优先级问题。

    *ptr[i] 相当于 *(ptr[i]) 当你的意思 (*ptr)[i] 当然, *(ptr[i]) 可能会导致segfault,因为动态分配的数组的内容是不确定的,然后您将取消引用该不确定的值。

    对代码的其他建议:

    • 始终如一地使用牙套。
    • 尽可能严格地限定循环变量的范围。我特别关注 i .
    • 函数在内存分配失败时退出整个程序是不寻常的。更常见的做法是向调用者返回一个表示失败的值,然后让调用者决定如何处理错误。
    • 在实践中,您可能还希望将动态分配的数组分配给本地指针变量,并在分配之前对其进行测试 *ptr 这样,在内存分配失败的情况下,原始内存将被 *ptr 仍然是可寻址的。