c - 为什么将 C 字符串作为 char* 传递给函数会导致运行时错误(但传递定义为 char[] 的 C 字符串是可以的)?
问题描述
我有一个简单的 C 程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void convertToUpperCase(char* sPtr);
int main(int argc, char** argv) {
char myString[] = "cHaRacTerS aND $32.95";
char* anotherString = "cHaRacTerS aND $32.95";
convertToUpperCase(myString); // THIS IS OK!
convertToUpperCase(anotherString); // THIS CAUSES RUNTIME ERROR
// (ie. build success but run fail)!
return (EXIT_SUCCESS);
}
void convertToUpperCase(char* sPtr) {
while (*sPtr != '\0') { // current character is not null (ie. end of string).
*sPtr = toupper(*sPtr); // turns valid characters into upper case
++sPtr; // point to next character within the string.
}
}
似乎传递anotherString
给期望 a 的函数char*
是问题所在。据我了解,两者myString
都anotherString
在char*
C 中。
在我看来,问题在于它们是如何定义的。因为myString
我将它定义为最后带有空终止符的字符数组。因为anotherString
它是一个指向某处字符串文字的字符指针。
但我不明白为什么在这种情况下定义它们的方式很重要。
提前致谢 :)
编辑:使用答案建议的特定术语。
解决方案
因为当你声明一个文字时,它是只读的。
char myString[] = "cHaRacTerS aND $32.95"; // readwrite memory
char* anotherString = "cHaRacTerS aND $32.95"; // placed in readonly memory
编辑:澄清一下,它不仅是只读的,而且是 UB 写入字符串文字。感谢您的评论,@chux-reinstate-monica
推荐阅读
- java - Jackson YAML 序列化对象数组格式
- c# - 为什么我不能创建自己的 Nullable 类似物
? - node.js - MongoDB - 从模式模型中仅查找具有布尔值 false 的元素
- spring-boot - 如何使用springboot和cloud foundry禁用tomcat访问日志
- r - 如何使用聚合对数据进行分组和插补?
- assembly - ARM64 SIMD 功能受到简单减法命令的瓶颈?
- javascript - 打字稿获取时间戳的日期
- swift - DJI iOS SDK 以编程方式下载多个图像。首次下载后相机忙
- python - Python + Scrapy + JSON:“NoneType”对象没有属性“body_as_unicode”
- django - 使用 Django ModelForm 建立一对多关系