请看下面的代码。我想知道这是否是将缓冲区传递给函数、填充它并将其作为返回的正确方法。也许有一些技术,我错过了,因为一些程序员在将数据添加到缓冲区之前用零填充缓冲区。除此之外,如果我有一些小错误或问题,请告诉我。多谢!
#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_data
和fill_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()
的指针。这调用了未定义的行为。