【发布时间】:2015-11-24 09:26:17
【问题描述】:
这个问题在过去很可能已经被回答过(很多次),但我无法通过搜索找到任何这样的答案。无论如何,这都是一个菜鸟问题。
我创建了一个小函数,它(粗略地)完成非标准 GCC 函数 strdup() 所做的事情。您将一个字符串传递给它,它会检查大小,为新字符串分配足够的内存,然后返回它(或 NULL)。但是,无论出于何种原因,我似乎无法在调用函数中释放该指针。我在运行时收到段错误或“无效指针”错误。
我怀疑问题仅仅是因为我试图释放的指针与最初发送到 malloc 的指针不同,并且可以通过将双指针传递给函数并让它为其分配新字符串,并且根本不返回任何内容,但令我困惑的是,我可以成功释放“官方” strdup() 函数返回的指针而没有任何问题。什么给了?
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup2(char *buf);
int main()
{
char *str1, *str2;
str1 = strdup("This is the first test!");
str2 = strdup2("This is the second test!");
printf("%s\n%s\n", str1, str2);
free(str1);
puts("First pointer successfully freed.");
free(str2);
puts("Second pointer successfully freed.");
return 0;
}
char *strdup2(char *buf)
{
size_t len = strlen(buf)+1;
char *str = malloc(len);
if (str == NULL)
return NULL;
memcpy(str, buf, len);
return buf;
}
运行它时,我得到:
This is the first test!
This is the second test!
First pointer successfully freed.
zsh: segmentation fault (core dumped)
【问题讨论】:
-
你应该始终
free你malloc(直接或间接)。您拨打malloc的在哪里并不重要。 -
strncpy 会比 memcpy 更好地为您服务,因为您想一开始就退出 \0
-
@JoachimPileborg 确实,从实用或 C 标准的角度来看,在哪里都没有关系。然而,从程序设计的角度来看,这很重要!
-
@CyberSpock strlen() 已经在字符串中找到了 '\0',难道 strncpy() 不是不必要的吗?鉴于我知道事物的确切大小(以字节为单位),memcpy() 似乎是最有效的方法。
-
@Roflcopter4 是的,你是对的