Linux C语言基础问题
#include <stdio.h>int main(){
char a='c';
char b[]="efgchij";
long d=strchr(b,a);
printf("%ld\n",d);
return 0;
}
将 b 定义为数组时,结果为不确定值的负整数
但将 b 定义为 字符串指针,结果就是固定的 正整数
请讲解一下原理 首先,应该包含头文件<string.h>
其次,strchr(char*,char)函数返回的为char*,
long d=strchr(b,a); 改为 char *p=strchr(b,a);
如果计算字符在字符串中的位置,
long d=p-b;
最后用printf()函数输出 问题不对的,b不是出错的重点。
“long d=strchr(b,a);”这句应该有编译时警告的(类型不同),或者是编译器睡着了。
printf()打印的d来自strchar()函数的返回值。
strchar()的函数功能:查找指定字符(变量a)在目标字符串(变量b)中出现的首位置,并返回指向该位置的指针(a在b中首次出现时的内存地址)。
所以d应该声明为char *类型的字符指针:
char * d = strchr(b,a);
printf("%p",d);语句打印了指针d的值(a所在的内存地址),指针的格式说明符是%p(编译器不支持时用%u或者%lu)
至于b,它实际上表示了存储在数据段的字符串的内存地址(是个地址常量),而且字符串是程序执行期间一直存在的)。更多的就建议看看有关字符串的C基础。 mingcxx 发表于 2016-5-2 16:48
问题不对的,b不是出错的重点。
“long d=strchr(b,a);”这句应该有编译时警告的(类型不同),或者是编译 ...
或许大部分东西你都说对了,但我最想知道的答案仍然没说清楚{:10_334:} dt3tc 发表于 2016-5-2 17:39
或许大部分东西你都说对了,但我最想知道的答案仍然没说清楚
先提醒一下strchar()的函数原型,没有包含string.h文件时,编译器无法找到这个函数。编译时你又忽略了警告。所以运行起来后,找不到位置的strchar()函数,d被随机分配一个值。至于随机负数和固定正数,我觉得应该不是b的原因,而是不同编译器的处理不同。比如我用的vs2013,在忽略了它的警告之后,我把错误的代码调试运行,试了1.b为数组,2.b为指针,3.包含头文件string.h 且 b为数组,4包含头文件string.h 且 b为指针;有连续3到6次左右出现相同7或8位的正数,继续调试就又变了。在我看来这就是编译器的处理了,它对错误的代码编译,出现了未知的结果,要继续了解恐怕得放下C语言去学编译原理之类的了。而且百度你所要的答案我也没找到。C Primer Plus也没说过这个“答案”。连百度都没法尽快找到和C Primer Plus都回答不了的问题,那我也无能为力了。 不懂在努力学习中 指针是变量,字符数组是一种指针类型而已,而且是常量。每次运行你的内存会进栈出栈,所以会不同正整数。但是指针的话就存放的是变量地址,所以总能找到字符。所以不变,这是我的猜测而已 zerco 发表于 2016-5-21 01:28
指针是变量,字符数组是一种指针类型而已,而且是常量。每次运行你的内存会进栈出栈,所以会不同正整数。但 ...
3q
页:
[1]