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



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

#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应该是同一个功能?(但为什么一个是空的,而另一个是返回状态的?

首先,malloc()可能会失败并返回NULL.始终检查malloc()的返回值并确保分配未失败。

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

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

最糟糕的是,然后您尝试free()不是来自malloc()的指针。这调用了未定义的行为。

最新更新