为什么将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 != '') { // 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传递到期望char*的函数中是个问题。根据我的理解,myStringanotherString在C.中都是char*

在我看来,问题在于它们是如何定义的。对于myString,我将其定义为末尾带有null终止符的字符数组。对于anotherString,它是指向某个字符串文字的字符指针。

但我不明白为什么它们的定义方式在这种情况下很重要。

提前感谢:(

编辑:根据答案使用特定的术语。

因为当您声明一个文字时,它是只读的。

char myString[] = "cHaRacTerS aND $32.95"; // readwrite memory
char* anotherString = "cHaRacTerS aND $32.95"; // placed in readonly memory

编辑:澄清一下,它不仅是只读的,它是UB写入一个字符串的文字。谢谢你的评论,@chux恢复monica

最新更新