定义缓冲区、传递给动态加载函数的正确方法是什么?
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_data
和fill_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()
的指针。这会调用未定义的行为。
请看下面我的代码。我想知道这是否是将缓冲区传递给函数、填充它并将其作为 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_data
和fill_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()
的指针。这会调用未定义的行为。