如果我有以下代码:
main(int argc, char *argv[]){
char serveradd[20];
strcpy(serveradd, argv[1]);
int port = atoi(argv[2]);
printf("%s %d \n", serveradd, port);打印命令行的前两个参数。但是,如果我这样做:
char serveradd[20];
strcpy(serveradd, argv[1]);
int port = atoi(argv[2]);
char versionnum[1];
strcpy(versionnum, argv[3]);
printf("%s %d %s \n", serveradd, port, versionnum);`第一个参数(serveradd)不会打印到屏幕上,也不会存储...为什么会发生这种情况?我如何修复它?谢谢!
发布于 2010-05-08 05:14:49
char versionnum[1];
strcpy(versionnum, argv[3]); 胡乱猜测,但您正在用这些行打破堆栈。使versionnum更大;目前,它只能安全地保存空字符串。
发布于 2010-05-08 05:17:35
你可能是在用核弹破坏记忆
char versionnum[1];
strcpy(versionnum, argv[3]);假设任何非空的、以null结尾的字符串的长度都将大于1个字符。
切勿直接使用strcpy();而应使用strncpy() (请注意-1以保留空终止符的空间):
char serveradd[20] = { 0 };
strncpy(serveradd, argv[1], sizeof(serveradd) - 1);
int port = atoi(argv[2]);
char versionnum[2] = { 0 };
strcpy(versionnum, argv[3], sizeof(versionnum) - 1);
printf("%s %d %s \n", serveradd, port, versionnum);发布于 2010-05-08 05:15:21
使用strcpy而不使用strlen测试要复制的字符串的长度,以确保它适合目标缓冲区,这是一个非常糟糕的主意。您应该使用strncpy,它是经过长度检查的,不会使目标缓冲区溢出。
不能将字符串存储在长度为1的字符数组中,因为null终止符只接受一个字符,所以您只能存储null字符。几乎可以肯定的是,您的缓冲区正在溢出。
https://stackoverflow.com/questions/2791717
复制相似问题