【问题标题】:How to fix this segfault?如何修复此段错误?
【发布时间】:2020-02-22 22:48:08
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



int toggleChars (char* string, char* letters){
    int count = 0;
    char* scurrent = string;
    while(*scurrent != '\0'){
        char* lcurrent = letters;
        while(*lcurrent != '\0'){
            if(*scurrent == *lcurrent){
                *scurrent = '0';
                count += 1;
            }
            lcurrent += 1;
        }
        scurrent += 1;
    }
    return count;
}


int main(){

    char* str = malloc(50);
    char* letters = malloc(20);

    str = "Hi how R U today?";
    letters = "HhiR";

    int x = toggleChars(str, letters);

    printf("str: %s\ncount: %d", str, x);


    return 0;
}

这只是我为即将到来的 C 编程考试而制作的一个测试函数。当我编译并运行它时,它给了我一个段错误。我通过一些测试推断它是由线路引起的

*scurrent = '0';

所以这意味着我不应该改变那个内存位置的字符。但是如果我真的想改变它,我该怎么办?

【问题讨论】:

  • 你不能这样分配字符串。在str = "Hi how R U today?"; 中,您将从malloc 获得的内存中的指针str 更改为只读内存中的常量字符串"Hi how R U today?"。尝试更改字符串会导致内存冲突。请改用strcpy(str, "Hi how R U today?");
  • @Frankie_C 谢谢!有效。我有另一个问题。如果我刚刚声明 char* str = "Hi how R U today" 和没有字母的相同内容,它也不行吗?我是否必须调用 malloc 并将字符串复制到内存中?有没有更好的方法?
  • 您可以创建一个本地 char 数组并使用您需要的字符串 对其进行初始化char str[50] = "Hi how R U today?";。编译器 CRT 将提供用于复制字符串。

标签: c pointers memory segmentation-fault


【解决方案1】:

您的代码有问题,str = "Hi how R U today?"; 行不会将字符串复制到您动态分配的字符数组,而是指向const char*(只读副本)。

因此,当您尝试通过 toggleChars() 函数更改 str 的内容时,它会引发分段错误。

您可以按如下方式编辑您的代码:

#include <stdio.h>

int toggleChars (char* string, char* letters){
    int count = 0;
    char* scurrent = string;
    while(*scurrent != '\0'){
        char* lcurrent = letters;
        while(*lcurrent != '\0'){
            if(*scurrent == *lcurrent){
                *scurrent = '0';
                count += 1;
            }
            lcurrent += 1;
        }
        scurrent += 1;
    }
    return count;
}

int main(){
    char str[] = "Hi how R U today?";
    char letters[] = "HhiR";
    int x = toggleChars(str, letters);
    printf("str: %s\ncount: %d", str, x);
    return 0;
 }

如果你想使用动态内存分配,你可以使用标准库中的strcpy() 函数来代替这个。 https://www.geeksforgeeks.org/strcpy-in-c-cpp/

谢谢,希望对你有帮助,

-拉库马尔

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2015-07-12
    • 2014-03-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多