3

C题

你好,

我将一个双指针传递给一个函数以分配一个双精度数组并用 10.10 初始化函数内部的数组;

我执行以下操作,但是当我在 main 中访问数组时出现分段错误;

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


}

有什么帮助吗?

4

2 回答 2

3

您违反了运算符优先级。

改变:

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

至:

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

请注意,如果您在编译时启用了警告(例如gcc -Wall ...),您的编译器会为您捕捉到这一点。始终在启用警告的情况下进行编译,并始终注意、理解和修复任何警告。

于 2013-01-18T14:46:23.740 回答
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;
}

此外,return 0;main(). 真的。

于 2013-01-18T14:50:48.333 回答