鱼C论坛

 找回密码
 立即注册
查看: 25|回复: 7

求助~

[复制链接]
发表于 昨天 23:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

void  main()
{
      void copy_string( char *from, char *to );

      char *a = "I am a teacher.";
      char *b = "You are a student.";
      
      printf("String a = %s\nString b = %s\n", a, b);
      printf("copy string a to string b:\n");

      copy_string(a, b);

      printf("\nString a = %s\nString b = %s\n", a, b);
}

void  copy_string( char *from, char *to )
{
      for( ; *from != '\0'; from++,to++)
      {
            *to = *from;
      }

      *to = '\0';
}

这是一个用字符型指针做形参,然后将a里面的内容复制给b,但是执行不了,这里面*b改为b[]就可以了,*b位于常量存储区,不能被改变,因此报错?将其改为b[]就可以了,那b[]在内存里是存放于哪里呢?请讲解一下~~谢谢~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 23:33 | 显示全部楼层
你好!你遇到的问题是关于C语言中字符串字面量和指针的常见错误。下面我来详细解释一下。

问题原因:
你的代码中,char *b = "You are a student."; 这一行声明了一个指针 b,它指向一个字符串字面量。在C语言中,字符串字面量(如 "You are a student.")存储在常量存储区(只读内存区域),这意味着它的内容不能被修改。当你调用 copy_string(a, b); 时,函数尝试修改 b 指向的内存,导致程序崩溃或未定义行为。

解决方案:
b 改为字符数组,这样字符串内容就存储在可写内存中。例如:


  1. #include <stdio.h>

  2. void main()
  3. {
  4.     void copy_string(char *from, char *to);

  5.     char *a = "I am a teacher.";  // a仍然指向常量字符串,但作为源,不会被修改
  6.     char b[] = "You are a student.";  // b是字符数组,内容可修改

  7.     printf("String a = %s\nString b = %s\n", a, b);
  8.     printf("copy string a to string b:\n");

  9.     copy_string(a, b);

  10.     printf("\nString a = %s\nString b = %s\n", a, b);
  11. }

  12. void copy_string(char *from, char *to)
  13. {
  14.     for (; *from != '\0'; from++, to++)
  15.     {
  16.         *to = *from;
  17.     }
  18.     *to = '\0';
  19. }
复制代码


解释:
1. 字符串字面量(如 "I am a teacher.")存储在常量存储区,只能读取,不能写入。
2. 指针 char *b 指向这样的常量字符串时,尝试通过指针修改内容会报错。
3. 字符数组 char b[] = "You are a student."; 将字符串内容复制到数组 b 中,数组存储在栈上(如果是在函数内部声明),内存可写。

b在内存中的存放位置:
- 当 b 声明为指针(char *b)时,b 本身是一个指针变量,存储在栈上,但它指向的字符串字面量存储在常量存储区。
- 当 b 声明为数组(char b[])时,整个数组(包括字符串内容)存储在栈上,因此可以安全修改。

注意:在修改后的代码中,a 仍然指向常量字符串,但因为它只作为源(from)不被修改,所以不会出错。如果你也需要修改 a,那么也应该将其改为数组。

希望这个解释能帮到你!如果还有疑问,请继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
FishC 发表于 2026-2-7 23:33
你好!你遇到的问题是关于C语言中字符串字面量和指针的常见错误。下面我来详细解释一下。

问题原因:

是不是可以这样理解,*b和b[]都是存储在栈区,但*b不能被修改,而b[]则可以被修改~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
但求过程001 发表于 2026-02-08 00:26
FishC 发表于 2026-2-7 23:33
你好!你遇到的问题是 ...


理解基本正确,但需要更精确地区分概念。我们来澄清一下:

1. 关于存储位置:
- *b(字符串字面量本身)存储在常量存储区(只读)
- b(指针变量)存储在栈区
- char b[] = "..."(数组)整个存储在栈区

2. 关于可修改性:
- 如果声明为 char *b = "...",那么通过指针b指向的字符串内容(常量区的字符串)不能被修改
- 如果声明为 char b[] = "...",那么数组b中的内容(栈区的字符串副本)可以被修改

3. 更准确的图示理解:

情况1(指针指向常量区):

  1. char *b = "Hello";  // b在栈区,"Hello"在常量区
  2. // b -> "Hello" (常量区,只读)
  3. // 尝试修改: b[0] = 'h';  // 错误!
复制代码


情况2(数组在栈区):

  1. char b[] = "Hello";  // 整个数组在栈区
  2. // 栈区: b[0]='H', b[1]='e', ...
  3. // 可以修改: b[0] = 'h';  // 正确
复制代码


4. 总结关键点:
- 指针变量本身(地址值)存储在栈区,可以修改它指向的地址
- 字符串字面量(用双引号括起来的)存储在常量区,内容不可修改
- 字符数组在栈区创建字符串的副本,内容可以修改

所以你的理解方向是对的,但更准确的说法是:通过指针访问常量区的字符串内容时不能修改,而栈区的数组内容可以修改。

这样解释清楚了吗?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
FishC 发表于 2026-2-8 00:27
理解基本正确,但需要更精确地区分概念。我们来澄清一下:

1. 关于存储位置:

那如果这题*p指向的不是字符串,是一个整型,那他的内容可以被修改吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
但求过程001 发表于 2026-02-08 00:35
FishC 发表于 2026-2-8 00:27
理解基本正确,但需要 ...


是的,可以修改,但需要注意区分不同的情况。让我详细解释一下:

1. 整型变量的情况:

int x = 10;        // 整型变量,存储在栈区
int *p = &x;       // 指针p指向x

// 可以通过p修改x的值
*p = 20;           // 正确!x现在等于20

printf("%d\n", x); // 输出20

2. 整型常量(const)的情况:

const int y = 30;  // 常量,不能直接修改
int *q = &y;       // 可以获取地址,但有警告(类型不匹配)

*q = 40;           // 这是未定义行为!可能导致程序崩溃或错误结果

3. 重要区别:
- 字符串字面量(如 "Hello")存储在只读的常量区
- 整型变量存储在可读写的栈区或堆区
- 整型字面量(如 5)通常直接嵌入代码,不占用可寻址的内存空间

4. 示例代码:

#include <stdio.h>

int main()
{
    // 情况1:指向整型变量 - 可以修改
    int a = 10;
    int *p1 = &a;
    *p1 = 20;  // 正确
   
    // 情况2:指向const整型 - 不应该修改
    const int b = 30;
    int *p2 = (int*)&b;  // 强制类型转换,不推荐
    *p2 = 40;  // 未定义行为,可能崩溃
   
    // 情况3:指向堆内存 - 可以修改
    int *p3 = malloc(sizeof(int));
    *p3 = 50;  // 正确
    free(p3);
   
    return 0;
}

总结:
对于整型指针,只要它指向的是可修改的内存区域(如普通变量、堆内存),就可以通过指针修改内容。但字符串字面量是特殊情况,因为C语言规定它们存储在只读区域。

字符串字面量的不可修改性是C语言的特殊设计,而普通整型变量没有这个限制。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
FishC 发表于 2026-2-8 00:36
是的,可以修改,但需要注意区分不同的情况。让我详细解释一下:

1. 整型变量的情况:

okok~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
但求过程001 发表于 2026-02-08 00:39
FishC 发表于 2026-2-8 00:36
是的,可以修改,但需 ...


理解清楚就好![s:24]

简单回顾一下关键点:
- 字符串字面量(如 "Hello")存储在常量区,不可修改
- 用字符指针指向字符串字面量时,只能读取不能写入
- 用字符数组存储字符串时,内容在栈区,可以修改
- 对于整型等普通数据类型,只要指向可写内存区域,都可以通过指针修改

如果还有其它疑问,随时来问~[s:26]

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-8 03:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表