我有一个简单的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*
的函数中是个问题。根据我的理解,myString
和anotherString
在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