2 sinat 24820331 sinat_24820331 于 2016.04.10 09:06 提问

关于字符串数组 做指针输入的问题 2C

#include
void gb(char **buf)
{
*buf[0] = 'a'; //这里down掉
}

int main()
{
char b[] = { "aaaasssddddasd" };
printf("%s\n", b);
gb(&b);
system("pause");
return 0;
}

b是常量指针,不能当做左值这个我知道,这个程序里的被调函数也没有修改b的值。
为什么在 *buf[0] = 'a'; 这里会编译不过去呢?

5个回答

sinat_24820331
sinat_24820331   2016.04.10 09:23

这是我画的内存模型图 老哥们看看有没有问题(O_O)?

sinat_24820331
sinat_24820331   2016.04.10 09:24

这是我画的内存模型图 老哥们看看哪里出了问题(O_O)?图片

qq423399099
qq423399099   Ds   Rxr 2016.04.10 11:40

首先这个b并不是常量指针,char *b = "aaaasssddddasd";这个才是常量指针,试图修改任何一个字符都会出现异常崩溃
其次这样的传参方式在很多编译器里过不去(例如VS)
*buf[0] = 'a';改成(*buf)[0] = 'a';试试

zcw1994
zcw1994   2016.04.10 14:32

如图,没交换值,只通过了编译
图片说明

yjz1409276
yjz1409276   2016.04.20 01:30

变量b被编译器编译在只读数据段。不能修改内容

yjz1409276
yjz1409276 如果b是动态分配的,则不会出现你的问题。
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
数组指针,字符串指针的几种定义方法
一:数组指针的定义方法int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p; p = &a[0]; // 等价于p = a;2.int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p = a; //定义指针时直接赋值; 二:输入字符串的方法1.直接把字符串输入到字符数组char str[] = "I love China!"; p
char[]数组名与指针,以及字符串数组与string的一些比较
1、数组名sizeof 得到的结果是数组长度+1,因为后面加上‘\0’; 2、string类型在vs2012中占用28个字节,在g++等一般编译器中占用4个字节 3、strlen()得到的就是真正的字符串长度,当然是没算上结束符‘\0’的; 4、s.length()得到的是真正的string字符串长度; 5、什么类型的指针都是占用四个字节,不论是int还是double抑或是什么东东。 6、全局的std::getline返回std::str
字符、地址详解(及字符串指针、字符数组关系)
前驱结点:指针、输入输出(请参照本专题其他文章) 地址是什么 地址,就是计算机找东西的“位置编号”。 内存,就是那个“位置编号”里存的东西。 是不是很形象?“地址”和“你想找的房子(内存)” 地址在汇编语言、编译原理、计算机组成原理课程中都有提到,但是在高级一些的语言就见不到了,被隐藏了。 汇编和编译原理中提到的地址用在数组上,汇编、操作系统的寻址,组成原理的”程序内存
C字符串数组与字符串指针
1,首先源码: #include #include int our_init_data = 30; int our_noinit_data; void our_prints(int a,int b,int c,int d) { int our_local_data = 1; char buf[1024]; char *rodata="he
浅谈数组与指针表示字符串的区别
指针表示字符串 /1/指针变量所占内存空间根据操作系统的位数会发生变化,同一位数操作系统下是固定的,64位操作系统占8个字节; /2/当指针变量指向字符串时,不能改变字符串的值,因为字符串只存在常量区,常量区的值不能被改变; /3/指针可以随意指向任意字符串;   数组表示字符串 /1/同一操作系统下,数组所占内存空间不是固定的,可以人为变大变小; /2/用数组表示字符串,数组定义的
函数内 声明一个字符数组和一个指向字符串数组的指针 区别
函数内 声明一个字符数组: char * Fuction()...{    char a[]="abcdefg";//存取在栈中    return a;                  //返回指向“栈内存”的指正,VC6.0发出warning}函数内声明一个指向字符串数组的指针: char * Fuction(){   char * p="abcdefg";/
C语言 字符串指针与二维字符串数组
31.字符串指针 char *str = "hello world";    //hello world这个字符串存储在常量区,str只保存了字符串常量的首地址 字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字
数组,字符串做输入输出参数
void fill_arry (int list[], int n, int value) { int i; for(i = 0;i < n; i++) list[i] = value ; }list[] 实际上存储了数组的起始地址,声明等同于 int *list fill_arry(x , 5 , 1); fill_arry(&x[0] , 5
字符与字符串(字符数组)的输入区别
char  c;scanf("%c",&c);char str[5];scanf("%s",str) //因为字符数组名本身代表地址 
数组、指针和字符串:指针用作函数参数、指针型函数和函数指针
一.指针用作函数参数        指针作函数形参时,我们调用此函数将实参值传递给形参后,实参和形参指针变量将指向相同的内存地址,那么在被调函数中对形参指针所指向的对象的改变会一样影响主调函数中实参指针指向的对象。        指针用作函数参数用什么作用呢?其一,使形参指针和实参指针指向相同的内存地址,在被调函数中可以使用主调函数中的数据并可以改变主调函数中的数据,达到数据双向传递的