首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的strdupa() -危险和重复

C中的strdupa() -危险和重复
EN

Stack Overflow用户
提问于 2015-11-16 03:10:37
回答 1查看 4.3K关注 0票数 4

我用C制作程序,我读过关于strdup()函数的文章。据我所知,strdup()函数分配空间,而strcpy()没有分配空间。但是strdup()的问题在于它分配空间,但没有释放空间。strdupa()分配和释放空间。但在某些地方,我读到strdupa()函数是危险的。如果有人能告诉我为什么strdupa()是危险的,那将是有帮助的。另外,当我试图在Open 12.1 32位系统中运行一个程序时,gcc给出了一个错误,它告诉我strdupa()不存在。如果strdupa()是一个危险的函数,有人能告诉我strdupa()的副本和在使用该函数时要使用的标头吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-16 03:18:41

strdupa()函数用于使用alloca()函数分配内存。这意味着当函数返回时,它的内存将被释放。alloca()函数不是奇数可移植的;strdupa()函数也不是全部可移植的。

手册页文档表明,strdupa()函数只有在使用-D_GNU_SOURCE编译时才可用,或者在使用gcc -std=gnu11或其他类似工具时才可用。

如果需要在调用strdupa()的函数返回后访问内存,则不能使用strdupa() - strdup()。如果您担心可移植性,您可能会使用strdup(),尽管这也只是由POSIX (strdup())而不是标准C定义的。注意,strdup()TR 24731-2: C库的扩展.第2部分:动态分配函数的一部分。AFAIK,alloca()既不是POSIX的一部分,也不是标准C库的扩展。

使用“strdupa()”有什么危险吗?

这取决于你对“危险”的定义。是。如果堆栈上没有足够的空间容纳字符串,那么strdupa()就会失败,而strdup()不会。有些人不喜欢alloca(),因此他们不喜欢使用alloca()的代码。alloca()手册页面有大量关于这些问题的说明,其中之一是您无法判断alloca()何时失败。

是否有检查alloca()故障的工具--比如内存泄漏的valgrind

您需要查找核心转储;如果程序崩溃,可能是因为alloca()分配失败。使用valgrind可能会发现问题;但是,您仍然无法可靠地从问题中恢复过来,而且您可能不会让您的生产代码在valgrind下运行,因此它充其量只是一种诊断辅助。如果您想要可靠的行为,使用strdup() -并接受您需要手动释放分配的内存。

来自alloca()的手册页

Notes alloca()函数与机器和编译器有关.对于某些应用,它的使用可以提高效率比使用malloc(3)和免费(3)。在某些情况下,它还可以简化在使用longjmp(3)或siglongjmp(3)的应用程序中的内存分配。否则,就不鼓励使用它。 因为由alloca()分配的空间是在堆栈帧中分配的,所以如果函数返回被一个对longjmp(3)或siglongjmp(3)的调用跳过,那么这个空间就会自动释放。 不要试图释放(3)由alloca()分配的空间! GNU版本的注释 通常,gcc(1)用内联代码将调用转换为alloca()。如果给出了-ansi-std=c89-std=c99-fno-builtin选项(并且不包括报头<alloca.h> ),则不会执行此操作。但要小心!默认情况下,<stdlib.h>的glibc版本包括<alloca.h>,其中包含行: #定义alloca(大小) __builtin_alloca (大小) 如果一个人拥有这个功能的私人版本,就会产生混乱的后果。 代码是内联的,这意味着不可能获取此函数的地址,也不可能通过链接到不同的库来更改其行为。 内联代码通常由一条调整堆栈指针的指令组成,不检查堆栈溢出。因此,不存在空错误返回。 Bugs 如果无法扩展堆栈帧,则没有错误指示。(但是,在分配失败后,如果程序试图访问未分配的空间,则很可能接收到SIGSEGV信号。) 在许多系统中,alloca()不能在函数调用的参数列表中使用,因为alloca()保留的堆栈空间将出现在函数参数空间的中间。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33727940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档