如果在已分配的内存上使用 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 工作正常。