在以下 C 代码中,你尝试使用 void * 类型的指针来初始化 double * 类型的实体,这是不允许的。malloc 函数返回的指针是 void * 类型的,你需要显式地将其转换为 double * 类型的指针,然后才能将其赋值给 merged_labelsmerged_scores

int total_samples = 0;
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < num_samples[i]; j++) {
        fprintf(merged_file, "%lf %lf\n", truelabels[i][j], pridictedvalues[i][j]);
        total_samples++;
    }
}
fclose(merged_file);

double* merged_labels = malloc(total_samples * sizeof(double));
double* merged_scores = malloc(total_samples * sizeof(double));

// 使用merged_labels和merged_scores进行操作

free(merged_labels); free(merged_scores);

错误: “void *” 类型的值不能用于初始化 “double *” 类型的实体。

解决方案:

double* merged_labels = (double*)malloc(total_samples * sizeof(double));
double* merged_scores = (double*)malloc(total_samples * sizeof(double));

解释:

  • malloc 函数分配的内存空间是一个原始的内存块,它没有特定的数据类型。
  • void * 指针可以指向任何类型的内存空间,但不能直接用于访问特定数据类型的数据。
  • 使用 (double*) 强制类型转换将 void * 指针转换为 double * 指针,允许你将该内存空间解释为 double 类型的数组。

最佳实践:

  1. 在使用 malloc 分配内存之后,始终检查返回的指针是否为 NULL,以确保内存分配成功。
  2. 使用完分配的内存空间后,务必使用 free 函数释放内存,避免内存泄漏。

示例:

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

int main() {
    int total_samples = 10;

    double* merged_labels = (double*)malloc(total_samples * sizeof(double));
    double* merged_scores = (double*)malloc(total_samples * sizeof(double));

    if (merged_labels == NULL || merged_scores == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    // 使用 merged_labels 和 merged_scores 进行操作

    free(merged_labels);
    free(merged_scores);

    return 0;
}

通过遵循这些最佳实践,你可以有效地处理指针和内存分配,并避免常见的 C 语言错误。

C语言:解决“void *” 类型值无法初始化“double *” 类型实体问题

原文地址: https://www.cveoy.top/t/topic/njWT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录