【问题标题】:Why is it causing run-time error even though we are passing it by pointer?为什么即使我们通过指针传递它也会导致运行时错误?
【发布时间】:2020-05-19 05:41:18
【问题描述】:

有人可以解释为什么它会导致运行时错误以及我应该添加什么来停止运行时错误吗?我认为它会起作用,因为 array1 是一个由 10 个指针组成的数组,每个指针都指向一个特定的实例。我只是对指针和结构感到困惑。

typedef struct book{

        double value1;

        int value2;

} Book;

void function1(Book * dArr){

        dArr->value1 = 200;

        dArr->value2 = 350;

}


int main(){

        Book *array1[10];

        for (i = 0 ; i < SIZE; ++i){

                init2 (array1[i]);

                printf ("In main(): value1: %14d, value2: %6d", array1[i]->value1, array1[i]->value2);

        }

}

【问题讨论】:

    标签: c


    【解决方案1】:
       Book *array1[10];
    

    上面声明了一个由 10 个指针组成的数组——但你没有将它们设置为指向任何东西......所以当你试图在你的 for 循环中取消引用它们时,你会调用未定义的行为并且你的程序崩溃。

    解决问题的最简单方法是声明一个包含 10 个对象的数组,这样就不用担心未初始化的指针:

       Book array1[10];
    
       for (i = 0 ; i < SIZE; ++i){
    
               init2 (&array1[i]);
    
               printf ("In main(): value1: %14f, value2: %6d\n", array1[i].value1, array1[i].value2);
    
       }
    

    另一种方法是在尝试推迟它们之前将指针设置为指向有效对象(例如,使用 new 运算符,或声明一个单独的 Book 对象数组并在指针数组中设置指针指向对象数组中的对象)...但这对于您正在尝试做的事情来说太过分了,并且引入了不必要的复杂性,所以我不推荐它。

    【讨论】:

    • value1double 所以 printf 格式字符串应该是:"... value1: %14f, ..." (在末尾添加一个 \n 也会使它好多了)。
    【解决方案2】:

    正如 Jeremy 所说,您正在尝试访问不存在的内存。我假设您正在尝试学习,所以我详细说明了。另外我假设您在 main 中对 init2 的调用是对 function1 的调用。

    int main(){
            int i;
            Book * array1[10];/*create 10 pointer variables to Book. At this stage
                                they point to nothing that is why you get an error
                                 when you try to dereference them */
            for(i=0;i<10;++i){
    

    /* C 风格的分配。现在 array1[i] 指向创建的 Book */

                    array1[i]=(Book *)malloc(sizeof(Book));
    
                   // array1[i]=new Book;//C++ style allocation
                    function1(array1[i]);
                    printf("In main(): value1: %14f,value2: %6d\n",array1[i]->value1,array1[i]->value2);
            }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多