我用C制作程序,我读过关于strdup()
函数的文章。据我所知,strdup()
函数分配空间,而strcpy()
没有分配空间。但是strdup()
的问题在于它分配空间,但没有释放空间。strdupa()
分配和释放空间。但在某些地方,我读到strdupa()
函数是危险的。如果有人能告诉我为什么strdupa()
是危险的,那将是有帮助的。另外,当我试图在Open 12.1 32位系统中运行一个程序时,gcc给出了一个错误,它告诉我strdupa()
不存在。如果strdupa()
是一个危险的函数,有人能告诉我strdupa()
的副本和在使用该函数时要使用的标头吗?
发布于 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()
保留的堆栈空间将出现在函数参数空间的中间。
https://stackoverflow.com/questions/33727940
复制相似问题