日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )

發布時間:2025/6/17 编程问答 31 豆豆

文章目錄

  • 一、報錯記錄
  • 二、修改方案





一、報錯記錄



執行下面的代碼 , 報錯如下 :

執行的錯誤代碼 :

#include <stdio.h> #include <stdlib.h> #include <string.h>int main() {// 將下面的字符串翻轉char *str = "sdfsdfsdabc4548411abc";// 計算字符串長度int len = strlen(str);// 指向字符串開始位置的指針char *p_start = str;char *p_end = str + len - 1;// 從兩邊向中間遍歷// 利用指向收尾的指針 , 交互指針指向的元素while (p_start < p_end) {// 交換收尾字符// 記錄 p_start 指針指向的首部字符char c = *p_start;// 將尾部字符賦值給首部字符*p_start = *p_end;// 將首部字符賦值給尾部字符*p_end = c;// 指向頭部的指針自增p_start++;// 指向尾部的指針自減p_end--;}// 打印結果printf("str = %s\n", str);// 命令行不要退出system("pause");return 0; }



二、修改方案



上述報錯是因為

// 將下面的字符串翻轉char *str = "sdfsdfsdabc4548411abc";

字符串導致 , 該字符串存儲在 全局區 的 常量區 ;

char *str 指針指向了 常量區 ;

之后 , 通過指針嘗試修改該常量區的字符串 , 才有了上述報錯 ;

// 交換收尾字符// 記錄 p_start 指針指向的首部字符char c = *p_start;// 將尾部字符賦值給首部字符*p_start = *p_end;// 將首部字符賦值給尾部字符*p_end = c;

修改方案 : 將字符串定義為如下樣式 , 字符串在 棧區 和 常量區各有一份 , 可以任意修改棧區的字符串 , 常量區的字符串僅用于賦值操作 ;

// 將下面的字符串翻轉char str[] = "sdfsdfsdabc4548411abc";

完整代碼 :

#include <stdio.h> #include <stdlib.h> #include <string.h>int main() {// 將下面的字符串翻轉char str[] = "sdfsdfsdabc4548411abc";// 計算字符串長度int len = strlen(str);// 指向字符串開始位置的指針char *p_start = str;char *p_end = str + len - 1;// 從兩邊向中間遍歷// 利用指向收尾的指針 , 交互指針指向的元素while (p_start < p_end) {// 交換收尾字符// 記錄 p_start 指針指向的首部字符char c = *p_start;// 將尾部字符賦值給首部字符*p_start = *p_end;// 將首部字符賦值給尾部字符*p_end = c;// 指向頭部的指針自增p_start++;// 指向尾部的指針自減p_end--;}// 打印結果printf("str = %s\n", str);// 命令行不要退出system("pause");return 0; }

總結

以上是生活随笔為你收集整理的【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。