首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

char*和char[][]的有关问题

2014-05-12 
char**和char[][]的问题长话短说:void output(char **buffer){printf(“%s\n”,buffer[0])}void main(){cha

char**和char[][]的问题
长话短说:
void output(char **buffer){
   printf(“%s\n”,buffer[0]);
}

void main(){
   char buffer[100][1024] = {0};
   int len = sprintf(buffer[0],"i am a bastard...");
   buffer[0][len] = '\0';
   output(buffer);
}

程序出现“段错误” 求解答!
[解决办法]

引用:
长话短说:
void output(char **buffer){
   printf(“%s\n”,buffer[0]);
}

void main(){
   char buffer[100][1024] = {0};
   int len = sprintf(buffer[0],"i am a bastard...");
   buffer[0][len] = '\0';
   output(buffer);
}

程序出现“段错误” 求解答!

是linux下gcc编译系统吗?在vs下错误信息就是write access violation at address 0xblablabla(大概是这么个错误提示吧,记不清了)。 为什么会出现这样的错误呢?这就值得好好探讨了。
首先,指针和数组是根本不同的两个东西!尽管它们有着千丝万缕的联系!
第二,要理解为什么出现上面这样的错误,需要理解两个最基本的东西:
(1)数组名称出现在表达式中时(除用于sizeof外),会被看成一个指向该数组第一个元素的指针。注意,本质上讲,C中所有数组都是一维数组,所以第一个元素是什么是非常明确的。比如,int a[10]的第一个元素是一个整型数,而int a[10][10]的第一个元素是一个包含10个整型数的数组。
(2)指针可以与整型数进行加减法,结果是新的指针,而加减的单位是指针所指向元素的大小。比如,int *p, p = a;(注意体会(1)在这儿的作用),则p + 1指向的是a[1],p+4指向的是a[4].
下面可以看一下为什么出现上面的错误了。
char buffer[100][1024]表示buffer是一个二维数组,output(buffer)中的buffer会被看做指向该二维数组第一个元素的指针,即被看作指向一个包含1024个char的数组的指针,char (*)[1024]是这个指针的类型。而在output的定义中,其期望的参数类型是char **,所以编译结果会有warning。当然,你依然可以运行,因为存在强制类型转换。这也是为什么4楼做法没用的原因,你显式的进行类型转换除了消除了warning外(机器是很好糊弄的),基本没有什么意义。接着分析出现错误的原因,output函数的参数声明是char **,即二级指针(pointer to pointer)。注意,强制类型转换不会改变指针的值。这样,buffer的值与main中定义的buffer的值是一样,不过output里的buffer是二级指针。那么buffer[0]是什么,buffer是二级指针,buffer[0]当然就是一级指针!buffer[0]等于多少?buffer[0]实际上是*(buffer+0),前面说过,指针是可以与整数进行加减法的(这是array index的基础),而加减的单位是该指针指向的元素的大小,buffer指向的是什么元素?char*!所以*(buffer+0)的值是0x6d612069(i am所占的四个字节的值对应的地址,注意little endian),因此,出现write access violation就不足为奇了。
大概就是这么个意思,有一些地方的表述是不够准确的,欢迎进一步探讨。

热点排行