这是一个简单的程序,函数abc在其中返回一个数组。但是输出是
Thanks
abcdefThanks
为什么会这样?我想要谢谢只打印一次。此外,我需要将a的大小取为6。在这个程序中,这并不重要,但我在需要的地方进行原始套接字编程。size=6在那里的预定义头文件中声明。我该如何实现它?
char *abc()
{
unsigned char *ch;
unsigned char a[7],c[6];
strncpy(a,"Thanks",strlen("Thanks"));
strncpy(c,"abcdef",strlen("abcdef"));
ch=malloc(50);
memset(ch,0,50);
memcpy(ch,&a,strlen(a));
memcpy(ch+strlen(a)+1,&c,strlen(c));
return ch;
}
int main()
{
char *a;
a=abc();
printf("n%sn",a);
printf("n%sn",(a+7));
fflush(stdout);
return 0;
}
感谢:(
调用strlen(a)
不会停止在您认为应该停止的地方,因为没有零终止符,垃圾内存会破坏您的结果strlen(字符串(不包括零终止符计数
你应该做以下(看看评论(
char *abc()
{
char *ch;
char a[7],c[7];
strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator
a[6] = ' '; // Prevent garbage from uninitialized memory to pester your ch and strlen(a)
strncpy(c,"abcdef",strlen("abcdef"));
c[6] = ' ';
ch=malloc(50);
memset(ch,0,50);
memcpy(ch,&a,strlen(a));
memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off
return ch;
}
int main()
{
char *a;
a=abc();
printf("n%sn",a);
printf("n%sn",(a+7));
fflush(stdout);
return 0;
}
上面的内容是用C++编译的,但经过一些调整后应该基本相同。
这里有一个类似转储的内存,其中#表示垃圾
char *abc()
{
char *ch;
char a[7],c[7];
strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator
// a = "Thanks##################################.."
a[6] = ' '; // Prevent garbage from uninitialized memory to pester your ch and strlen(a)
// a = "Thanks ############################"
strncpy(c,"abcdef",strlen("abcdef"));
// c = "abcdef############################"
c[6] = ' ';
// c = "abcdef ############################"
ch=malloc(50);
// ch = "###############################"
memset(ch,0,50);
// ch = "000000000000000000000000000000"
memcpy(ch,&a,strlen(a));
// ch = "Thanks000000000000000000000000"
memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off
// ch = "Thanksabcdef00000000000000000"
return ch;
}
您忘记了通过追加0字节来零终止字符串。
unsigned char a[7], c[7]; // 7 = 6+1 since "Thanks" and "abcdef" have 6 bytes
strncpy (a, "Thanks", 6);
a[6] = (char)0;
strncpy (c, "abcdef", 6);
c[6] = (char)0;
您的c
字符串太短,并且没有明确地以0结尾。所以你的strlen(c)
是未定义的行为