如果在已分配的内存上使用 strdup 会发生什么
What happends if you use strdup on an already allocated memory
我的堆栈实现有一些问题,我的推送函数操纵我发送到函数中的值并更改它。我尝试了不同的构造方法,但它们要么不起作用,要么给我损坏的输出。
基本思路是下面这个,注意:我的pop函数只走一个位置,并没有释放特定位置的内存。我无法使用 strcpy,因为我正在使用线程。
strdup 是否改变了它复制的值,我找不到任何信息说是这种情况,我的理解是你应该能够在它被欺骗后使用该值。
正确如何在已分配的内存上使用 strdup space,我认为我不能只是释放它然后再次使用它.
void stack_push(Stack *s, char *value)
{
if (s->size == s->capacity) {
realloc_stack(s);
}
if(s->data[s->size] == NULL){
// The current position does not contain any data.
s->data[s->size] = strdup(value);
}
else{
free(s->data[s->size]);
s->data[s->size] = strndup(value, strlen(value) + 1);
}
s->size += 1;
}
编辑 s->data = char **data
strdup
基本上是这样的(为简洁起见没有错误检查):
char *strdup(const char *stringtoduplicate)
{
char *newstring = malloc(strlen(stringtoduplicate) + 1);
strcpy(newstring, stringtoduplicate);
return newstring;
}
你这样使用它:
char Foo[] = "Bar";
char *newBar = strdup(Foo);
Foo[0] = 'F';
printf("%s %s\n", Foo, newBar); // prints: Far Bar
...
free(newBar); // once you're done with newBar, free it
现在您应该可以回答自己的问题了。
strdup
不会以任何方式修改其参数。如果您查看 strdup
的原型,您会看到它的参数被声明为 const
,这意味着它没有被修改。
strdup
可以实现为:
char* strdup(const char* s) {
char* n = malloc(strlen(s) + 1);
if (n) strcpy(n, s);
return n;
}
没有魔法。
顺便说一句,您可以对线程使用 strcpy
。但是 strdup
工作正常。
我的堆栈实现有一些问题,我的推送函数操纵我发送到函数中的值并更改它。我尝试了不同的构造方法,但它们要么不起作用,要么给我损坏的输出。
基本思路是下面这个,注意:我的pop函数只走一个位置,并没有释放特定位置的内存。我无法使用 strcpy,因为我正在使用线程。
strdup 是否改变了它复制的值,我找不到任何信息说是这种情况,我的理解是你应该能够在它被欺骗后使用该值。
正确如何在已分配的内存上使用 strdup space,我认为我不能只是释放它然后再次使用它.
void stack_push(Stack *s, char *value)
{
if (s->size == s->capacity) {
realloc_stack(s);
}
if(s->data[s->size] == NULL){
// The current position does not contain any data.
s->data[s->size] = strdup(value);
}
else{
free(s->data[s->size]);
s->data[s->size] = strndup(value, strlen(value) + 1);
}
s->size += 1;
}
编辑 s->data = char **data
strdup
基本上是这样的(为简洁起见没有错误检查):
char *strdup(const char *stringtoduplicate)
{
char *newstring = malloc(strlen(stringtoduplicate) + 1);
strcpy(newstring, stringtoduplicate);
return newstring;
}
你这样使用它:
char Foo[] = "Bar";
char *newBar = strdup(Foo);
Foo[0] = 'F';
printf("%s %s\n", Foo, newBar); // prints: Far Bar
...
free(newBar); // once you're done with newBar, free it
现在您应该可以回答自己的问题了。
strdup
不会以任何方式修改其参数。如果您查看 strdup
的原型,您会看到它的参数被声明为 const
,这意味着它没有被修改。
strdup
可以实现为:
char* strdup(const char* s) {
char* n = malloc(strlen(s) + 1);
if (n) strcpy(n, s);
return n;
}
没有魔法。
顺便说一句,您可以对线程使用 strcpy
。但是 strdup
工作正常。