51Testing软件测试论坛

标题: (求助)一个简短的c语言代码困扰我 [打印本页]

作者: clearsight    时间: 2008-5-6 12:22
标题: (求助)一个简短的c语言代码困扰我
# include "stdio.h"
void main()
{
        char *a="test";
        *a='c';
        printf("%s",a);
}

上面这段代码哪里错了?我想把test换成cest输出,字符串在c语言中不是作为字符数组存在于内存中吗,指针变量a应该指向"test"中的首地址't',语句*a='c';把t换成了c,可是这段代码执行报错
作者: huior    时间: 2008-5-6 14:49
最简单的方法,可以用数组轻松实现
#include "stdio.h"
void main()
{

        char a[] = "test";
        a[0]='c';
        printf("a=%s",a);

}
作者: qq102568183    时间: 2008-5-6 15:47
没有错啊,我用WIN-TC编译运行 结果显示 a=cest
是lz编译器的问题吧
作者: twf    时间: 2008-5-6 16:21
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者是有区别的,不能混为一谈,主要有几点:


1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。

2、初始化方式:如char str[ ]={ "I love China! ");这是对数组中的每个元素做初始化。
   char *a="I love China! ";并没有对数组初始化,只是对指针变量初始化。

3、赋值方式:对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
char str[14];
str="I love China! ";
而对字符指针变量,可以采用下面方法赋值:
char *a;
a="I love China! ";

但注意赋给a的不是字符,而是字符串的首地址。
4、赋初值时,对以下的变量定义和赋初值:

char *a="I love China! ";

等价于:

char *a;

a="I love China! ";

而对数组初始化时:

static char str[14]={ "I love China! "};

不是等价于

char str[14];

str[ ]= "I love China! ";

即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。

5、在定义一个数组时,在编译时即已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋以一个地址位,则它并未具体指向哪一个字符数据。如:

char *a,str[10];

a=str;

scanf("%s",a);

先使a有确定值,也就是使a指向一个数组的开头,然后输入字符串到该地址开始的若干单元中。

6. 指针变量的值是可以改变的,如:

void main(void)

{char *a="I love China! ";

a=a+7;

printf("%s",a);

}

运行结果应该如下:

China!

指针变量a的值可以变化,输出字符串从a当时所指向的单元开始输出各个字符,直到遇’\0’为止。而数组名虽然代表地址,但它的值是不能改变的。下面是错的:

char str[ ]={ "I love China! "};

str=str+7;

printf("%s",str);

针对你这个问题可以修改成这样:

# include "stdio.h"
void main()
{

char[] b="test";
char *a=b; *a='c';
printf("%s",a);
}

先写这么多,不知道能理解不?
作者: bwg198411    时间: 2008-5-6 17:22
楼上说的太复杂了,
简单说当你执行 char *a="test";这句后
字符串指针变量a指向"test"的首地址也就是字符"t"的地址

当你执行 *a='c';这句时等价与 "t"='c' 对于一个字符常量赋值肯定是错误的,如果是在VC下编译会提示内存不能写入,TC2.0我没试,在win-tc下第一次运行可能会成功,如果你再运行的话,输出的结果肯定不是你想要的,会有写入错误的提示。

不知道说的对不,高人来说下吧
附个图

[ 本帖最后由 bwg198411 于 2008-5-6 17:27 编辑 ]
作者: 1997goodluck    时间: 2008-5-8 14:29
字符串是常量,只能读,不能对它进行写操作.以前16位的,32位的操作系统对应用程序的内存使用进行了限制,读和写分开了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2