无法从我的 main 访问函数中使用 malloc 分配的内存

Cannot access memory allocated with malloc in a function from my main

提问人:Δημήτρης Μπακίρης 提问时间:10/17/2023 更新时间:10/17/2023 访问量:85

问:

据我所知,在函数中使用 malloc 分配内存允许您在 main 中使用该内存,直到您手动释放它。我有一个函数,可以读取MNISTI图像文件,并以整数数组的形式为每个图像创建一个向量。代码如下:

int* readNextMNISTImage(const char* file_path) {
    static int current_image = 0;

    FILE* file = fopen(file_path, "rb");
    if (file == NULL) {
        fprintf(stderr, "Error opening file: %s\n", file_path);
        return NULL;
    }

    fseek(file, 16 + IMAGE_SIZE * current_image, SEEK_SET);

    int* vector = (int*)malloc(IMAGE_SIZE * sizeof(int));
    if (vector == NULL) {
        fprintf(stderr, "Error allocating memory for image vector.\n");
        fclose(file);
        return NULL;
    }

    for (int j = 0; j < IMAGE_SIZE; ++j) {
        uint8_t pixel;
        size_t bytesRead = fread(&pixel, sizeof(uint8_t), 1, file);
        if (bytesRead != 1) {
            fprintf(stderr, "Error reading pixel data.\n");
            free(vector);
            fclose(file);
            return NULL;
        }
        vector[j] = (int)pixel; // Store pixel value as an integer
    }
    for (int i=0;i<IMAGE_SIZE;i++)
    printf("%d ", vector[i]);
    fclose(file);
    current_image++;
    return vector;
}

如果我在这个函数中添加一个 for 循环来打印向量数组的内容,我可以看到它完全按照我想要的方式创建。取值介于 0 到 255 之间的字节数组。一切都很好。我在我的主函数中返回指向该数组的指针,并尝试以相同的方式打印它,以便我可以看到它是否可用,并且我得到一个 seg 错误。我想这是非常基本的东西,但我无法弄清楚为什么。这是我的主要:

int main() {
    char file_path[256];    
    
    printf("Enter the path to the dataset file: ");
    scanf("%s", file_path);
    
    int* vector = readNextMNISTImage(file_path);
    for (int i = 0; i < IMAGE_SIZE; i++)
    printf("%d ", vector[i]);
    free(vector);
    return 0;
}
C 函数 指针 返回 malloc

评论

0赞 pmg 10/17/2023
摆脱石膏;确保您拥有 .#include <stdlib.h>
0赞 dbush 10/17/2023
通过 valgrind 运行代码。如果你对内存管理不善,它会告诉你在哪里。
0赞 Δημήτρης Μπακίρης 10/17/2023
感谢您的建议。Valgrind 没有发现任何错误,我已经包含了 stdlib 并且删除了强制转换。可悲的是,问题仍然存在
0赞 Lundin 10/17/2023
使用虚拟内容删除文件访问权限后,我无法重现该问题。所以我猜问题实际上出在文件 I/O 或其他一些未发布的代码中。

答:

0赞 Δημήτρης Μπακίρης 10/17/2023 #1

解决。我在我的 .h 文件中的函数声明中缺少一个字母......我想如果是这样的话,程序就不会编译了。对不起,给大家添麻烦了

评论

0赞 pmg 10/17/2023
打开所有编译器警告,包括说您正在调用范围内没有原型的函数的警告:-)否则编译器假定函数返回 int ...在你的情况下,与.-- 见 gcc.gnu.org/onlinedocs/gcc/...intint *