"a WRITE memory access" 导致的错误

An error caused by "a WRITE memory access"

老实说,我认为学习 C 并不难,因为我已经了解其他几种语言,但我的代码有问题,而且我似乎无法弄清楚如何解决这些错误.我专注于 Python,所以由于类型、指针等的所有规范,这有很大不同。无论如何,这是下面的代码,抱歉,我会粘贴错误,但它不允许我复制粘贴。我正在使用一些打印函数,发现错误来自第 9 行,“*returnStr += *str”;。在此先感谢您的帮助。

#include <stdio.h>
#include <cs50.h>
#include <string.h>

char *multiplyString(const char *str, int num){
    char *returnStr = "";

    for (int i = 0; i < num; i++){
        *returnStr += *str;
    }

    return returnStr;
}

int main(void){
    bool asking = true;
    int height;
    const char *symbol = "#";
    while (asking == true){
        height = get_int("How tall should the pyramid be? pick a number between 1 and 8: ");
        if (8 >= height && height >= 1){
            asking = false;
        }
    }
    for (int i=1; i<=height; i++){
        printf("%s  %s\n", strcat(multiplyString(" ", height-i), multiplyString(symbol, i)), multiplyString(symbol, i));
    }
}

multiplyString()改成下面的

char *multiplyString(const char *str, int num) {
    // + 1 for null-terminator
    char *returnStr = calloc(sizeof(*returnStr), strlen(str)*num + 1);

    for (int i = 0; i < num; i++) {
        strcat(returnStr, str);
    }

    return returnStr;
}

您试图修改 C 中禁止的字符串文字。其次,+= 不是 C 中的字符串连接;相反,它试图对 returnStr.

的第一个字符执行整数加法

要解决此问题,您可以使用 calloc() 动态分配适当数量的内存(这还将内存初始化为 0,这是 strcat() 所必需的)。然后,在每次迭代中,使用 strcat() 将字符串追加到新字符串的末尾。

请记住在程序后面释放此函数返回的字符串,因为它们是动态分配的。

两个问题:

  • 首先,returnStr指向一个字符串字面量,它实际上是一个只读字符数组。在这种情况下,只有一个字符的数组,即字符串终止符 '[=11=]'

  • 其次,*returnStr += *str;没有意义。与returnStr[0] = returnStr[0] + str[0]相同。由于目标 (returnStr[0]) 是一个字符串文字,尝试写入它会导致 未定义的行为

如果要创建一个包含 str 个副本的 num 个新字符串,则需要创建一个至少包含 num * strlen(str) + 1 个字符的新字符串,+1 为终结者。然后你需要使用 strcat 连接成那个新字符串。

此外,如果您动态分配内存(例如 malloc),那么您需要确保第一个元素被初始化为字符串终止符。