在C语言中分配数组并从函数中给数组赋值

4

C问题

你好,

我正在将一个双重指针传递给一个函数,以分配一个双重数组,并在函数内部使用10.10初始化数组;

我按照以下方式操作,但是当我在主函数中访问数组时出现分段错误;

void function(double **array, int size){

    *array = (double*) malloc(size * sizeof(double)); 
    int i;
    for(i=0;i<size;i++){
    *array[i] = 10.10;
    }


}

int main(){

    double *array = NULL;

    function(&array,20);
    printf("array[0] = %lg\n",array[0]);// here is where I get segmentation fault


}

有需要帮助的地方吗?

1
“这里是我遇到分段错误的地方”并不在你遇到分段错误的那一行。 - user529758
作为一则旁注:将类型强制转换为double* a) 是不必要的,b) 是错误的,因为你实际上拥有的是double** - Andreas Grapentin
2
@Andreas:你对(a)是正确的,但不对于(b);-) - Paul R
@AndreasGrapentin 这是相当错误的,因为它是不安全的。 - user529758
@PaulR 哎呀,你当然是对的。 - Andreas Grapentin
2个回答

4

您遇到了运算符优先级问题。

更改为:

for(i=0;i<size;i++){
    *array[i] = 10.10;
}

to:

for(i=0;i<size;i++){
    (*array)[i] = 10.10;
}

请注意,如果您启用了警告信息编译(例如gcc -Wall ...),则编译器将会为您捕获此错误。请始终启用警告信息编译,并始终注意、理解和修复任何警告信息。

2
*array[i]

这并不意味着你想的那样(使用C运算符优先级表查找)。

不要使用难以理解、丑陋混乱的代码(是的,它刚才让你困惑了),而是使用一个临时变量(千万不要为了天堂的爱将malloc的返回值进行转换!):

void function(double **array, int size)
{
    if (array == NULL) return;

    double *tmp = malloc(size * sizeof(*tmp)); 
    if (tmp == NULL) {
        *array = NULL;
        return;
    }

    int i;
    for (i = 0; i < size; i++) {
        tmp[i] = 10.10;
    }

    *array = tmp;
}

同时,main() 函数需要 return 0;。真的。


如果malloc失败,可能会用上*array = NULL - Ed Heal
@EdHeal 还要检查输出参数的地址是否有效(非NULL):) - user529758
从main()返回0是很好的风格,但自C99以来不再是必需的。 - Lundin
@Lundin,我之所以建议这么做不是因为必须,而是因为像你建议的那样,这是一个好的习惯。 - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接