"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
),那么您需要确保第一个元素被初始化为字符串终止符。
老实说,我认为学习 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
),那么您需要确保第一个元素被初始化为字符串终止符。