|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<stdio.h>
- #include<string.h>
- int main(){
- char s1[50];
- int smalls1,smalls2;//定义了两个整型变量
- char hello[] = "hello world";
- smalls1 = "hello";//将字符串赋值给了整型变量
- smalls2 = " world";//将字符串赋值给了整型变量
- sprintf(s1,"%s%s",smalls1,smalls2);//本意是要练习这个库函数,效果是把两个字符串拼接起来,写进s1
- printf("%s\n",s1);//这里输出了hello world
- printf("%d\n",strcmp(hello,s1));这里输出了0
- printf("%s\n",smalls1);//这里输出了hello
-
- return 0;
- }
复制代码
上述代码犯了很低级的错误,奇怪的是编译器只是警告了
[Warning] assignment makes integer from pointer without a cast
用strcmp()比较“hello world”和本应出错的s1时返回值是0,表示二者一致,请问编译器是怎么处理把字符串赋值给int型变量这种情况的?
自动帮我纠错了?
在这段代码中,将字符串赋值给整型变量 smalls1 和 smalls2 是犯了低级错误,应该把它们声明为字符数组,而不是整型变量。编译器发出了警告,但并没有阻止程序继续运行。
在执行 sprintf(s1,"%s%s",smalls1,smalls2); 时,由于 smalls1 和 smalls2 是整型变量,而不是字符串,因此编译器会将它们解释为指针,即将它们的地址作为字符串的起始地址。这样会导致程序访问未定义的内存区域,可能导致程序崩溃或输出错误的结果。
在这个特定的例子中,由于 smalls1 和 smalls2 的地址正好是字符串 "hello" 和 " world" 的起始地址,因此 sprintf 函数实际上拼接了这两个字符串,并将结果写入了字符数组 s1 中。但这种行为是不可预测的,因为它依赖于内存布局的细节。
在比较 "hello world" 和 s1 时,由于它们的内容相同,strcmp 函数返回了 0。
|
|