【问题标题】:allocating array and assigning values from a function C分配数组并从函数 C 赋值
【发布时间】:2013-01-02 07:17:23
【问题描述】:

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


}

有什么帮助吗?

【问题讨论】:

  • “这是我得到分段错误的地方”不在你得到段错误的那一行。
  • 作为旁注:double* 的转换是 a) 不必要的,b) 错误的,因为你真正拥有的是 double**
  • @Andreas:你是对的(a)但不是(b);-)
  • @AndreasGrapentin 这是相当错误的,因为它不安全。
  • @PaulR 哎呀,你当然是对的。

标签: c arrays function pointers segmentation-fault


【解决方案1】:

您违反了运算符优先级。

变化:

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

到:

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

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

【讨论】:

    【解决方案2】:
    *array[i]
    

    并不意味着你认为它做了什么(使用C operator precedence table 查找)。

    不要使用不可读、丑陋和令人困惑(是的,它只是让你感到困惑)的代码,而是使用临时变量(并且不要为了上帝的爱而强制转换 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()。真的。

    【讨论】:

    • 如果malloc 失败,也许*array = NULL 不会出错。
    • @EdHeal 检查输出参数的地址是否有效(非 NULL):)
    • return 0 from main() 是很好的风格,但从 C99 开始就没有必要了。
    • @Lundin 我没有建议它,因为它是必要的,而是因为它是一种很好的做法,正如你所建议的那样。
    猜你喜欢
    • 2022-12-05
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2020-09-08
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多