首页 > 解决方案 > uint8_t 数组返回在所有情况下都会导致错误(**、*、&,什么都没有)

问题描述

int8_t** FileToColorMap(char* colorfile, int* colorcount)
{
    FILE* fp = fopen (colorfile, "r");
    if (fp==NULL) 
    { 
        printf("no such file."); 
        return 0; 
    } 

    int r,g,b;
    fscanf(fp, "%d", colorcount);
    uint8_t* output;
    output = (uint8_t *)malloc(*colorcount * sizeof(uint8_t));
    for (int i = 0; i < *colorcount;i++) {
        if( fscanf(fp, "%d %d %d", &r, &g, &b) != EOF ) {
            // int* arr= (int *)malloc(3 * sizeof(int));
            // arr[0] = r;
            // arr[1] = g;
            // arr[2] = b;
            int arr[3] = {r,g,b};
            output[i] = *arr;
        } else
        {
            freeMap(i+1, &output);
            return NULL;
        }
        
    }
    fclose(fp);
    return *output;
}

即使我尝试返回输出、**输出和输出,这也会导致 seg 错误错误或错误 1 ​​或其他错误。

看起来您的帖子主要是代码;请添加更多细节。

标签: cpointersmemory-addressuint8t

解决方案


有很多问题:

  1. 错误的类型和分配
uint8_t* output;
output = (uint8_t *)malloc(*colorcount * sizeof(uint8_t));

您需要在此处声明指向指针的指针并为非 uint8_t 的指针分配空间

两个数组的类型错误。arr是自动变量并且在函数范围之外取消引用它是一个 UB

  • 许多其他问题
int8_t** FileToColorMap(char* colorfile, int* colorcount)
{
    FILE* fp = fopen (colorfile, "r");
    if (fp==NULL) 
    { 
        printf("no such file."); 
        return 0; 
    } 

    int8_t r,g,b;
    if(fscanf(fp, "%d", colorcount) != 1)
    {
       /* fscanf failed - do something */
    }
    int8_t **output = malloc(*colorcount * sizeof(*output));
    for (int i = 0; i < *colorcount;i++) {
        if( fscanf(fp, "%hhx %hhx %hhx", &r, &g, &b) == 3) {

            uint8_t *arr = malloc(3 * sizeof(*arr));
            arr[0] = r;
            arr[1] = g;
            arr[2] = b;
            output[i] = arr;
        } else
        {
            freeMap(i+1, &output);
            return NULL;
        }
        
    }
    fclose(fp);
    return output;
}

如果 malloc,请始终检查结果。我不是为了清楚起见


推荐阅读