指向字符串的指针变量

soundbean 2021-02-01 07:05:28
大家看看这个图的代码,我跟着这位赵海英老师学的C语言,按照他讲的内容,我实践了一下,发现代码有问题。输出的结果和他讲的不一样,还给出了警告。 char *p="1234567";是有问题吗? 当我改为了 char *p="1234567"; 才能正确输出。 这是怎么回事啊老师是讲错了吗?
...全文
357 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2021-05-08
  • 打赏
  • 举报
回复
"123453245" 这个其实是const char [字符长度],是个字面值,不能直接用char* 去绑定,而是要用const char* 绑定。
  • 打赏
  • 举报
回复
看老的资料,用新的工具,是要考虑一下,随意下定论不宜,知识应该是有传承的.
ggglivw 2021-05-08
  • 打赏
  • 举报
回复
编译器太古老了,换新编译器,直接编译出错。话说做视频的都不运行下程序的吗还是他们用的VC6在跑?
  • 打赏
  • 举报
回复
其它且不论,说指针有问题,没发现,要仔细检查自己写得是否有问题.
  • 打赏
  • 举报
回复
均陵鼠侠 2021-05-08
  • 打赏
  • 举报
回复 1
不请自来。 闲来无事,既然看到了这个话题,就来说一说。这实际上涉及字符数组、字符串和字面串这三者的关系,厘清了,自然就明白了。 首先,字面串和字符数组是C语言里的东西,而字符串则是C标准库的内容,严格来说并不是C语言的一部分。 什么是字符串?字符串是一个字符的序列,以第一个遇到的空字符终止。什么是字面串?字面串就是“字面意义上的字符串”,是我们写在程序中的、用来代表字符串的文本,毕竟它还需要由编译器来识别并生成字符串,所以才叫“字面串”,比如 "xyz"。相反,字符串是位于可执行程序或者内存里的字符序列,而且以第一个遇到的空字符终止。那么,什么是字符数组呢?它首先是一个数组。然后,它的元素类型是char、wchar_t、char16_t或者char32_t。 可以肯定,字符串也是字符数组,这很好理解。但是反过来,字符数组并不一定是字符串,因为字符数组中未必包含空字符 ,这样它就无法形成一个字符串。 要构造一个字符数组,方法有很多。典型地,字面串就可以自动生成字符数组。按规定,在程序翻译期间,字面串用于生成一个具有静态存储期的字符数组,而且自动添加一个空字符。这样一个数组是没有名字的,C语言只规定了这个数组的生存期是静态的,也就是,从程序启动时就存在,程序结束时才销毁,但并没有说别的。C语言只是保证,根据字面串的书写形式,它的元素类型可以是 char、wchar_t、char16_t或者char32_t。所以,认为 "xyz" 是 const char 类型的数组,是错误的。 用字面串生成的静态数组位于哪里呢?不一定,这取决于系统架构。在有些简单的机器上,不存在内存保护机制,也没有分页机制,比如运行在 8086 处理器上的MS-DOS系统。在这种机器上,用字面串生成的静态数组当然是可读可写的。但是在现代的很多机器上,内存有保护机制,也引入了分页,可执行映像比以前更复杂,用字面串生成的静态数组可能被安排在只读的内存区域,这就不可写了。 标准化之后的C语言考虑了这些因素,因此规定,如果程序企图去修改这样一个(从字面串生成的)数组,这种行为是未定义的。对于我们来说,不要强调你所认识的机器架构,也不要拿你的汇编知识来加强这种认识,更不要武断地说这个字符数组一定是不可写入的,毕竟这是C语言。 用字面串可以生成字符串,但这两者不见得是等价的,因为一个字面串可以生成多个字符串。比如对于字面串 "abc\0xyz\0",这个字面串生成了一个静态数组,而这个数组包含了三个字符串:字符串abc、xyz,以及最后的空串 \0 (这最后一个\0是在生成字符数组时自动添加的)。最后,我们用一个例子来结束这次探讨。
# include <stdio.h>

int main (void)
{
    char a [] = "abc\0xyz\0";
    char * p = "he\0she\0";

    printf (p);
    printf (p + 3);
    printf (p + 7);
}
在第一个声明中,字面串 "abc\0xyz\0" 用于在程序翻译期间生成一个具有静态存储期的匿名数组,并用这个数组的内容初始化数组 a ;在第二个声明中,字面串 "he\0she\0" 用于在程序翻译期间生成一个具有静态存储期的匿名数组。作为变量 p 的初始化器(Initializer),数组类型的表达式自动转换为指向数组首元素的指针,并用于初始化变量 p 。 然后,在变量 p 指向的地方(它指向数组的首元素),依次有三个字符串。这三个 printf 依次打印这些字符串。最后打印的是空串,所以什么内容也没有。
赵4老师 2021-05-08
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
soundbean 2021-02-02
  • 打赏
  • 举报
回复
引用 3 楼 自信男孩的回复:
strcpy(p+3, s+9);这句会出现段错误,因为p指向的字符串是只读的,而这句会对它写;
其他的输出语句都没问题,因为都不会对p指向的字符串进行写操作;

要想让这句strcpy(p+3, s+9)执行没问题,需要对p定义成字符数组。不过需要注意额是由于有copy和strcat,建议把字符数组的长度定义更长一些,
防止越界。
明白了明白了 谢谢
自信男孩 2021-02-01
  • 打赏
  • 举报
回复
strcpy(p+3, s+9);这句会出现段错误,因为p指向的字符串是只读的,而这句会对它写;
其他的输出语句都没问题,因为都不会对p指向的字符串进行写操作;

要想让这句strcpy(p+3, s+9)执行没问题,需要对p定义成字符数组。不过需要注意额是由于有copy和strcat,建议把字符数组的长度定义更长一些,
防止越界。
forever74 2021-02-01
  • 打赏
  • 举报
回复
是的,可以说老师讲的不对。 按照原文,strcpy那行企图修改字符串字面量的行为是未定义行为。
soundbean 2021-02-01
  • 打赏
  • 举报
回复
我改成了char p[20]="1234567";才对 上面文字说明打错了。在这里更正一下

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧