我有Node
typedef struct Node{
unsigned int length;
char *string;
} Node;
此操作接受指向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。也许我忽略了一些东西,但是无法弄清楚
答案 0 :(得分:5)
strncpy(newString,string,sizeof(newString));
在这种情况下sizeof
没有做你想做的事。通过您分配的尺寸或不要使用strncpy
。如果您遵循自己的逻辑,那么您已经信任string
,因为您在拨打strlen
时已经使用了malloc
。
因此,您可以安全地使用strcpy
。
如果你愿意有点不便携,你就可以逃脱:
newString = strdup(string);
答案 1 :(得分:1)
您的sizeof()调用导致您的问题:
sizeof(newString);
newString是一个指向字符的指针:
char *newString;
字符指针使用(通常)2,4或8个字节(取决于机器架构)。
所以很明显,你只复制了前2/4/8个字节。使用strlen(string) + 1
表示要复制的字符数。
或者你可以使用strcpy()
。这将处理终止空字节。由于您使用malloc()
正确调用strlen
,因此strcpy()
无法导致溢出。
答案 2 :(得分:1)
您无法使用sizeof()
来确定字符串长度。
您必须使用strlen(string)
功能。
此外,您需要在复制的符号后设置\0
以终止字符串。
答案 3 :(得分:0)
不确定,但请直接尝试:
strncpy(node->string,string,strlen(newString));
将长度函数更改为 strlen 。
(我试图将代码中的更改设为粗体)