-1

我有这个结构Node

typedef struct Node{
  unsigned int length;
  char *string;
} Node;

此操作接受指向 a 的指针Node并尝试附加提供的字符串:

int setString(Node *node, char *string){

  char *newString;
  if(!isString(node) || !string) return 0;

  newString = (char *) malloc(strlen(string)+1);
  if(!newString) return 0;

  /*THIS PART FAILS*/
  strncpy(newString,string,sizeof(newString));

  node->string = newString;
  node->length = strlen(newString);

  /*Which can be seen here*/
  printf("Original String: %s\n",string);
  printf("Copied String: %s\n",node->string);

  return 1;
}

在指示的部分,我可以看到原始字符串似乎没有被复制到node->string. 它会复制前两个字符,然后接下来的内容要么是垃圾,要么是空白。

我检查了这篇文章,我正在关注第三种情况,这似乎适用于 OP。也许我忽略了一些东西,但就是不知道在哪里

4

4 回答 4

5
strncpy(newString,string,sizeof(newString));

在这种情况下sizeof不会做你想做的事。通过您分配或不使用strncpy的大小。如果您遵循自己的逻辑,那么您已经信任,string 因为您在strlen调用时接受了它malloc

因此,您可以安全地使用strcpy


如果你愿意去一点非便携,你可以侥幸逃脱:

newString = strdup(string);
于 2013-03-17T10:25:53.453 回答
1

您的 sizeof() 调用导致您的问题:

sizeof(newString);

newString 是一个指向字符的指针,在这里声明:

char *newString;

字符指针(通常)使用 2,4 或 8 个字节(取决于机器架构)。所以很明显,您只复制了前 2/4/8 个字节。用于strlen(string) + 1要复制的字符数。

或者你可以只使用strcpy(). 这将处理终止的空字节。由于您使用malloc()正确调用,strlen因此没有机会导致溢出strcpy()

于 2013-03-17T10:27:31.527 回答
1

您不能使用sizeof()来确定字符串长度。

您必须改用该strlen(string)功能。

您还需要\0在复制符号之后设置以终止字符串。

于 2013-03-17T10:28:19.993 回答
0

不确定,但直接试试这个:

strncpy(node->string,string,strlen(newString));

将长度函数更改为strlen

(我试图将代码更改为粗体)

于 2013-03-17T10:29:24.447 回答