C语言中argv输出不符合预期,请求技术排查
问题分析与修复方案
嘿,我一眼就瞅出你代码里的几个关键问题,这就是导致输出不符合预期的原因:
1. main函数的参数类型错误
你写的是int main(int argc, int **argv),但标准的命令行参数中,argv应该是字符串指针数组,也就是char **argv。int **类型和实际传入的参数类型不匹配,这会导致后续的指针操作行为未定义。
2. 指针地址的打印格式错误
你用%d来打印argv[i]的地址,但%d是用来打印十进制整数的,指针应该用%p格式符,它会以正确的格式(通常是十六进制)输出指针地址,避免因指针长度和整数长度不一致导致的错误。
3. 参数内容的打印方式错误
*argv[i]是取argv[i]这个字符串指针指向的第一个字符的ASCII值,而不是打印整个参数字符串。要打印完整的参数内容,应该直接使用argv[i],配合%s格式符。
修正后的代码
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { // 修正argv的类型 int i; printf("argc=%d\n", argc); for (i = 0; i < argc; i++) { printf("address argv[%d] = %p\n", i, argv[i]); // 用%p打印指针地址 printf("value argv[%d] = %s\n", i, argv[i]); // 用%s打印完整字符串 } return 0; }
执行./test 1 2 3的预期输出
编译运行修正后的代码,你会得到符合预期的结果:
argc=4 address argv[0] = 0x7ffee3b5b5c0 // 这个地址会因系统/环境不同而变化 value argv[0] = ./test address argv[1] = 0x7ffee3b5b5e0 value argv[1] = 1 address argv[2] = 0x7ffee3b5b5e2 value argv[2] = 2 address argv[3] = 0x7ffee3b5b5e4 value argv[3] = 3
内容的提问来源于stack exchange,提问作者Thomas D.
相关产品推荐
相关产品推荐

