我用C编写程序.我读到了strdup()函数.从我所知道的,该strdup()函数分配空间而strcpy()不是.但问题strdup()是它分配空间但不释放空间.strdupa()分配和释放空间.但在某些地方我读到这个strdupa()功能很危险.如果有人能告诉我为什么strdupa()危险会很有帮助.此外,当我试图在我的Open Suse 12.1 32位系统中运行程序时,gcc发出一个错误,告诉它strdupa()不存在.如果strdupa()是危险函数,有人可以告诉我strdupa()使用该函数时要使用的副本和标题.
记录该strdupa()函数以使用该alloca()函数来分配内存.这意味着当函数返回时,它的内存被释放.该alloca()功能不是单一的便携式; 该strdupa()功能同样不是那么便携.
手册页说明该strdupa()功能仅在-D_GNU_SOURCE您使用gcc -std=gnu11或使用或类似的东西时可用.
如果你需要在调用strdupa()返回的函数后访问内存,那么你不能使用strdupa()- strdup()是必要的.如果你担心可移植性,你可能会使用strdup(),尽管这只是由POSIX(strdup())而不是标准C 定义.注意这strdup()是TR 24731-2的一部分:C库的扩展 - 第二部分:动态分配函数.AFAIK alloca()不是POSIX或标准C库的建议扩展的一部分.
使用'strdupa()'有危险吗?
这取决于你对"危险"的定义.是.如果字符串上没有足够的空间用于字符串,那么strdupa()在strdup()不会的情况下会失败.有些人并不迷恋,alloca()因此他们不热衷于使用的代码alloca().该alloca()手册有一个广泛的一组有关的问题,其中之一是,当你不能告诉笔记alloca()失败.
是否有工具来检查
alloca()故障 - 例如valgrind内存泄漏?
你寻找核心转储; 如果程序崩溃,可能是因为alloca()分配失败.使用valgrind可能发现问题; 但是,你仍然无法从问题中可靠地恢复,并且你可能不会在你的生产代码下运行valgrind,因此它至多是一个诊断辅助工具.如果您想要可靠的行为,请使用strdup()- 并接受您需要手动释放分配的内存.
alloca()注意
该alloca()函数取决于机器和编译器.对于某些应用,与使用malloc(3)加free(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>不包括在内).但要小心!默认情况下,glibc版本<stdlib.h>包含<alloca.h>并包含以下行:Run Code Online (Sandbox Code Playgroud)#define alloca(size) __builtin_alloca (size)如果有这个功能的私人版本,会产生混乱的后果.
代码内联的事实意味着不可能获取此函数的地址,或通过链接到不同的库来更改其行为.
内联代码通常由调整堆栈指针的单个指令组成,并且不检查堆栈溢出.因此,没有返回NULL错误.
错误
如果无法扩展堆栈帧,则没有错误指示.(但是,在分配失败后,如果程序尝试访问未分配的空间,程序可能会收到SIGSEGV信号.)在许多系统
alloca()中不能在函数调用的参数列表中使用,因为保留的堆栈空间alloca()将出现在函数参数的空间中间的堆栈中.