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) 我有以下C代码片段,必须识别错误并建议更安全地编写它的方法:
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Run Code Online (Sandbox Code Playgroud)
所以错误是strlen忽略'\0'了字符串的尾随,因此不会为副本分配足够的内存,但是我不确定他们更安全地写它是什么?
我可以使用malloc(strlen(somestring)+1))我假设,但我认为必须有一个比这更好的方法?
编辑:好的,我接受了答案,我怀疑我们不会期待strdup解决方案,因为它不是ANSI C的一部分.这似乎是一个非常主观的问题,所以我不确定我是不是接受实际上是最好的.无论如何,谢谢你的所有答案.
我有一些C++ 0x代码.我能够在下面重现它.下面的代码工作正常,-std=c++0x但我需要它为我的真实代码.
我如何在C++ 0x中包含strdup?与gcc 4.5.2
请注意我正在使用mingw.我尝试包括cstdlib,cstring,string.h并尝试使用std ::.没运气.
>g++ -std=c++0x a.cpp
a.cpp: In function 'int main()':
a.cpp:4:11: error: 'strdup' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
码:
#include <string.h>
int main()
{
strdup("");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 编译以下代码:
#include <string.h>
#define FOO (NULL)
int main(int argc, char *argv[])
{
char *foo;
if (FOO)
foo = strdup(FOO);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
导致以下编译器警告:
foo.c: In function ‘main’:
foo.c:9:3: warning: null argument where non-null required (argument 1) [-Wnonnull]
foo = strdup(FOO);
^
Run Code Online (Sandbox Code Playgroud)
但是,strdup如果FOO是NULL因为if (FOO)检查将不会被调用.有没有办法避免这种警告?
谢谢!
具有以下内容:
#include <set>
std::set<const char *> global = std::set<const char *>();
void x() {
const char *c = "a";
const char *d = "b";
global.insert(c);
global.insert(d);
}
int main() {
x();
for (std::set<const char *>::const_iterator iter=global.begin(), end=global.end(); iter!=end; ++iter) {
printf("%s\n", *iter);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,正如预期的那样,我收到a并b打印出来.
然而,是否有任何保证,例如,如果该集合是一个bozo对象的一部分,那么它们一直持续到它bozo的生命周期结束?或者我必须strdup要确保字符串?
使用后为什么strdup(value) (int)value返回不同的输出?如何获得相同的输出?
我的简短示例变坏了,请使用长的:这里是测试的完整代码:
#include <stdio.h>
#include <iostream>
int main()
{
//The First Part
char *c = "ARD-642564";
char *ca = "ARD-642564";
std::cout << c << std::endl;
std::cout << ca << std::endl;
//c and ca are equal
std::cout << (int)c << std::endl;
std::cout << (int)ca << std::endl;
//The Second Part
c = strdup("ARD-642564");
ca = strdup("ARD-642564");
std::cout << c << std::endl;
std::cout << ca << std::endl;
//c and ca are NOT equal Why?
std::cout << (int)c << std::endl;
std::cout …Run Code Online (Sandbox Code Playgroud) 我或多或少地使用Bison&Flex 1个月,所以如果我没有看到明显的东西(但我认为不是这样),我很抱歉.
我有一个关于使用Flex Bison释放内存的问题.这是我的代码的样子:
parser.l
{DATE} { yylval.str= strdup(yytext);
pair<string,string> newpair = make_pair("DATE",yytext);
myvector.push_back(newpair);
return TOKEN_DATE ;}
Run Code Online (Sandbox Code Playgroud)
这是我的.l文件的一个例子.我将yytext的值复制到yylval.str中.然后我创建一个具有该内容的新对(实际上是键/值),然后我返回bison的令牌日期.我的解析器.y不超过yyparse; 当抓到东西时,它就会打印出来.
我尝试在此运行valgrind,我有关于strdup的多个错误.我知道这个函数使用malloc,但我不知道WHERE和WHEN使用FREE.
我可能猜测它在.y文件中,但在哪里?
test:
TOKEN_DATE { cout << $1 << endl; // here ? and what to free ?}
Run Code Online (Sandbox Code Playgroud)
我真的没有得到所有这些,我真的很感激一个简单明了的解释.
提前致谢,
编辑:
我试过几件事:
test:
TOKEN_DATE TOKEN_TOTO TOKEN_BLABLA { cout << $1 << endl; free($1); free($2);}
| TOKEN_DATE test { cout << $1 << endl, free($1); }
Run Code Online (Sandbox Code Playgroud)
它似乎编译和执行良好,但valgrind仍然告诉我,strdup函数中包含的malloc存在问题.但我不能在flex文件中写自由(yylval.str),否则,野牛不会意识到这个值(如果我理解正确,我试过它不起作用).我真的不知道如何消除这个泄漏的问题.
当我编译下面的一小段代码(我们在其中定义一个字符串,然后使用strdup进行复制)时,我得到3个警告:来自GCC的2个编译器警告和来自valgrind的1个运行时警告/错误.
我怀疑内存泄漏错误(由valgrind报告)也与我使用strdup有关,这就是我在下面包含相关输出的原因.
我究竟做错了什么?(我正在通过一本C书,这就是作者使用strdup的方式.)
代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char *string1 = "I love lamp";
char *string2;
string2 = strdup(string1);
printf("Here's string 1: %s\n"
"Here's string 2: %s\n",
string1, string2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
警告/输出:
dchaudh@dchaudhUbuntu:~/workspaceC/LearnCHW/Ex17_StructsPointers$ make test
cc -std=c99 test.c -o test
test.c: In function ‘main’:
test.c:9:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
string2 = strdup(string1);
^
test.c:9:11: warning: assignment makes pointer from integer without a cast [enabled by default]
string2 = strdup(string1);
^ …Run Code Online (Sandbox Code Playgroud) 我想不出我的问题的正确标题,所以在这里.我正在尝试学习C,以下代码来自我正在遵循的教程.
struct Person {
char *name;
int age;
int height;
int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight){
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
return who;
}
void Person_destroy(struct Person *who){
assert(who != NULL);
free(who->name);
free(who);
}
int main(int argc, char *argv[]){
struct Person *joe = Person_create("Joe Alex", 32, 64, 140);
........
Run Code Online (Sandbox Code Playgroud)
我的问题是Person_create功能为什么我们要复制name到新的内存位置who->name.为什么我们不能只who->name …
附:
char *x = malloc(1024);
strcpy(x, "asdf");
x = strdup(x);
free(x); // OK
free(x); // Segfault
Run Code Online (Sandbox Code Playgroud)
如果我只是释放一次,我还会泄漏吗?如果是这样,如何避免呢?
strdup ×10
c ×7
c++ ×3
cstring ×2
bison ×1
c++11 ×1
containers ×1
flex-lexer ×1
g++ ×1
gcc ×1
gcc-warning ×1
malloc ×1
memory ×1
memory-leaks ×1
pointers ×1
string ×1
struct ×1
valgrind ×1