我读到的strcpy
是复制字符串,并strdup
返回指向新字符串的指针以复制字符串.
您能否解释一下您喜欢使用strcpy
哪些情况以及您更喜欢使用哪些情况strdup
?
当我strdup
在Microsoft Visual C++中使用时,它警告我:
警告C4996:'strdup':不推荐使用此项目的POSIX名称.而是使用符合ISO C++的名称:_strdup.详细信息请参见在线帮助.
这似乎_strdup
是正确的.
但是当我_strdup
在GCC(Fedora Linux OS)中使用时,编译器显示错误:
错误:未在此范围内声明'_strdup'
使用GCC和Linux,编译器不会显示任何错误strdup
.
哪个是正确的 - strdup
或者_strdup
?
注意:我包含<string.h>
在我的代码中.
在我的应用程序中,我收到了多个内存泄漏.对象是Malloc 48字节,它始终来自负责的调用者strdup.该对象的历史记录仅显示它是Malloced,没有其他保留或释放.堆栈跟踪不显示我的任何代码.我可以选择的唯一相关内容是:
10 UIKit _UIGestureRecognizerSendActions
9 UIKit -[UIScrollView handlePan:]
8 UIKit -[UIScrollView _endPanWithEvent:]
7 UIKit -[UIScrollView(Static) _startTimer:]
6 CoreFoundation CFNotificationCenterAddObserver
5 CoreFoundation _CFXNotificationRegisterObserver
4 libnotify.dylib notify_register_dispatch
3 libnotify.dylib notify_register_mach_port
2 libnotify.dylib token_table_add
1 libsystem_c.dylib strdup
0 libsystem_c.dylib malloc
Run Code Online (Sandbox Code Playgroud)
它似乎在地图视图上滚动时发生,但我不确定如何继续,因为堆栈中没有引用我的代码.我该如何进行诊断?
如果需要任何进一步的信息,请告诉我.
问候,尼克
我最近意识到strdup()
我喜欢在OS X上使用的功能不是ANSI C的一部分,而是POSIX的一部分.我不想重写我的所有代码,所以我想我只是要编写自己的strdup()
函数.这并不难,真的,它只是一个malloc()
和一个strcpy()
.无论如何,我有这个功能,但是如果我编写这个函数并将其链接到我的代码,我该怎么做,它已经存在于libc中了?我的链接器或编译器是否允许我基本上定义我自己的函数版本,还是我必须给它另一个名字?如果有一种方法可以重用相同的名称,那将是非常方便的,因此如果strcpy()
存在于用户的libc中,他们可以使用它,但如果它们的libc中不存在,则可以使用我的版本,而只需使用少量代码尽可能地改变.
简短版本:
a)当我编写与内置函数同名的自己的函数时会发生什么?
b)我可以做些什么来避免在strdup()
没有重写我的所有代码而不使用的平台上发生的不良事情strdup()
,这有点单调乏味?
在C中,您可以使用strdup
简洁地分配缓冲区并将字符串复制到其中.然而,据我所知,一般记忆没有类似的功能.例如,我不能说
struct myStruct *foo = malloc(sizeof(struct myStruct));
fill_myStruct(foo);
struct myStruct *bar = memdup(foo, sizeof(struct myStruct));
// bar is now a reference to a new, appropriately sized block of memory,
// the contents of which are the same as the contents of foo
Run Code Online (Sandbox Code Playgroud)
那么,我的问题有三个:
malloc
和memcpy
?strdup
但不包括memdup
?我正在调用strdup
,必须在调用之前为变量分配空间strdup
.
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Run Code Online (Sandbox Code Playgroud)
我这样做了吗?或者这里有什么问题吗?
我想使用 POSIX 的basename
功能(而不是 GNU 的)。
从手册页:
dirname() 和 basename() 都可以修改 path 的内容,因此在调用这些函数之一时可能需要传递一个副本。
这些函数可能会返回指向静态分配的内存的指针,这些内存可能会被后续调用覆盖。 或者,它们可能会返回指向 path 某些部分的指针,以便在不再需要函数返回的指针之前,不应修改或释放 path 引用的字符串。
它还说:
返回值
dirname() 和 basename() 都返回指向以空字符结尾的字符串的指针。(不要将这些指针传递给 free (3)。)
因此,该示例建议如下:
例子
Run Code Online (Sandbox Code Playgroud)char *dirc, *basec, *bname, *dname; char *path = "/etc/passwd"; dirc = strdup(path); basec = strdup(path); dname = dirname(dirc); bname = basename(basec); printf("dirname=%s, basename=%s\n", dname, bname);
在strdup
(strndup
)手册页说:
新字符串的内存通过 malloc(3) 获得,并且可以通过 free(3) 释放。
所以问题是:我应该释放 dirc 和 basec(按照strdup
)还是不释放(按照basename
)?
我正在为包含名称的书写一个C++类:
class Book {
private:
char* nm;
..........
............
..........
...........
};
Run Code Online (Sandbox Code Playgroud)
我不被允许std::string
在这项任务中使用.所以我在这里strdup
用来将参数名称的值复制到构造函数中的nm:
Book::Book(const char *name, int thickness, int weight)
: nm(NULL)
, thck(thickness)
, wght(weight)
{
if (name)
nm = strdup(name);
}
Run Code Online (Sandbox Code Playgroud)
是否有替代方法可以在不使用的情况下实现相同的结果strdup
,而是使用关键字new
?
strdup是否每次都分配另一个内存区域并创建另一个指针?
例如:以下代码是否导致内存泄漏?
void x(char** d, char* s){
*d = strdup(s);
}
int main(){
char* test = NULL;
x(&test, "abcd");
x(&test, "etc");
return 0;
}
Run Code Online (Sandbox Code Playgroud)