首页 > 解决方案 > 为什么将 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*是问题所在。据我了解,两者myStringanotherStringchar*C 中。

在我看来,问题在于它们是如何定义的。因为myString我将它定义为最后带有空终止符的字符数组。因为anotherString它是一个指向某处字符串文字的字符指针。

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

提前致谢 :)

编辑:使用答案建议的特定术语。

标签: cstring

解决方案


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

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

编辑:澄清一下,它不仅是只读的,而且是 UB 写入字符串文字。感谢您的评论,@chux-reinstate-monica


推荐阅读