【问题标题】:segmentation fault when declaring a table as double *table in a structure将表声明为结构中的双 *表时出现分段错误
【发布时间】:2021-07-29 16:05:38
【问题描述】:

我想在 structre 中将表声明为变量:

 struct func_params{
        double *table;
     };

在我的主程序中调用表时

   int main(int argc, char **argv){

            struct func_params params;
            printf("%e \n",params.table[0]);
      return(0);
 
      }
  

我收到segmentation fault 错误,但如果我将表定义为double table[2500],那就没问题了。我想知道为什么因为我认为 C 中的表基本上是指针......

【问题讨论】:

    标签: c pointers segmentation-fault


    【解决方案1】:

    您必须在取消引用之前初始化(分配缓冲区并分配)指针。

    一般来说,未初始化的非静态局部变量(具有自动持续时间)的值是不确定的,使用这些值会调用 未定义的行为。因此,如果在没有初始化的情况下打印,即使有 double table[2500] 这样的定义也找不到。

    #include <stdio.h>
    #include <stdlib.h>
    
    struct func_params{
      double *table;
    };
    
    int main(int argc, char **argv){
    
      struct func_params params;
    
      params.table = malloc(sizeof(*params.table) * 2500); /* initialize pointer (allocate) */
      if (params.table == NULL) return 1; /* check if allocation succeeded */
    
      params.table[0] = 42; /* initialize the element to print */
    
      printf("%e \n",params.table[0]);
    
      free(params.table); /* deallocate the buffer */
      return(0);
    
    }
    

    【讨论】:

    • 好的,非常感谢!如果我理解正确,*params.table 指的是表的第一个值?
    • 是的。 A[B] 等价于 *((A)+(B))*params.table 等价于*(params.table+0),即等价于params.table[0]
    【解决方案2】:
     *params.table // first element.
    

    访问下一个元素

     *(params.table + 1) // next element
    

    数组的名称是数组的地址。并且在逻辑上 数组的地址和第一个元素的地址相同。 分配的内存允许您像使用数组一样使用指针。

     array == &array[0] // name of array, same address as 1st array element
     *(array) == array[0] //value 1st element
     *(array + 1) == array[1] // value 2nd element
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2014-05-31
      • 2011-03-23
      相关资源
      最近更新 更多