【问题标题】:C - pass reference to pointer to function for malloc?C - 传递对malloc函数指针的引用?
【发布时间】:2021-05-22 08:39:07
【问题描述】:

我正在尝试将指针引用(双精度)传递给函数,并且在函数内部我想为该指针分配内存并用 10s 填充它。在 x64 和 x86 的 Visual Studio 中,它不会用 10 填充内存,而是用 0 填充内存。 我不太明白我在这里做错了什么。

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

void GetData(double** d) {
    
    *d = malloc(sizeof(double) * 100);
    if (*d == NULL)
        return;

    memset(*d, 10, 100 * sizeof(double));
}

int main(void) {

    double* data;

    GetData(&data);

    for (int i = 0; i < 100; i++) {
        printf("%f\n", data[i]);
    }


    return 0;
}

【问题讨论】:

  • malloc 是否获得void** 参数?不,它返回一个指向已分配内存的指针。 C 函数有返回值是有原因的。使用它们。
  • memset 填充字节值,不能与双精度值一起使用。

标签: c pointers malloc memset


【解决方案1】:

改变这一行:

memset(*d, 10, 100 * sizeof(double));

到:

for (int i = 0; i < 100; ++i)
        (*d)[i] = 10.0;

memset 逐字节填充。因此,不是该数组的每个元素都变为 10.0,而是该数组的每个元素的每个字节将变为 10。所以 memset 不能使用双精度数。

【讨论】:

    【解决方案2】:

    我建议尽量减少使用副作用(如修改指针参数引用的对象)并尽可能使用返回值。

    memset 设置 字节。将双精度数中的所有字节设置为 10 不会将双精度值设置为 10.0

    double *GetData(size_t num) {
        
        double *d = malloc(sizeof(*d) * num);
        if (d)
            for(size_t index = 0; index < num; index++)
                d[index] = 10.0;
        return d;
    }
    
    int main(void) {
    
        double* data = GetData(100);
    
        for (int i = 0; d && i < 100; i++) {
            printf("%f\n", data[i]);
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 2019-09-16
      • 2015-02-11
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多