定义缓冲区、传递给动态加载函数的正确方法是什么?

What is the right way to define buffer, pass to a function for a dynamic load?

请看下面我的代码。我想知道这是否是将缓冲区传递给函数、填充它并将其作为 return 取回的正确方法。也许有一些技巧,我错过了,因为一些程序员在向缓冲区中添加数据之前用零填充缓冲区。除此之外,如果我有一些小错误或问题,请务必让我知道。非常感谢!

#define BUFFER_SIZE 256

void get_data(char *ptr, size_t len)
{
    char* temp = (char*)malloc(len * 1);
    char sample_data[] = "data";
    strcpy(temp, sample_data, sizeof(sample_data));
    memcpy_s(ptr, len, temp, len);
    free(temp);
}

int main(void) 
{
    int status = EXIT_SUCCESS;

    char* data = (char*)malloc(BUFFER_SIZE * 1);

    status = get_data(data, BUFFER_SIZE);

    if(status != 0)
        return EXIT_FAILURE;        

    free(data);

    return EXIT_SUCCESS;
}

好像问题有点多

我猜get_datafill_data应该是同一个函数吧? (但为什么一个无效而另一个 return 状态?)

首先,malloc()可以失败,returnNULL。始终检查 malloc() 的 return 值并确保分配没有失败。

其次,在 get_data() 中,您使用 char* temp = (char*)malloc(len * 1); 分配了一些内存并使用 char *temp 指向它。但是随后,您有效地丢弃了该内存并使 temp 指向字符串 "fill_data_with_something" 。在这种特殊情况下,get_data() 内的内存分配是完全没有必要的。而被malloc'd的内存就不可挽回地丢失了,变成了内存泄漏!

第三,您从缓冲区复制了 256 个字节,而仅包含 "fill_data_with_something",这肯定小于 256。因此您正在读取超出缓冲区末尾的内容。您应该只复制 strlen(temp) 个字节。

最糟糕的是,您随后尝试 free() 一个并非来自 malloc() 的指针。这会调用未定义的行为。