【问题标题】:Return a Pointer in C (Segment Fault Troubleshoot)在 C 中返回一个指针(段故障排除)
【发布时间】:2016-02-21 16:03:08
【问题描述】:

(我是c语言新手)

我试图从一个函数返回一个指针,我收到segment fault 错误。我知道这通常是因为运行循环不必要的时间或试图访问内存中不必要的位置。我昨晚和今天早上都花了整整,但仍然无法弄清楚我犯的愚蠢错误。

这是我正在尝试获取指针的函数

char *mySubStr(char *find, char *search){
    char *p, *q, *i;
    int count;
    p = find;
    q = search;
    int size = strlen(q);

    char *start = malloc ( size + 1 );

    for (i=p; i != '\0'; i++){
            if (i == q){
                    count = 0;
                    start = i;
                    while(i == q){
                            i++; count++; q++;
                            if(count == size) return start;
                    }
                    q = search;
            }
    }
    return NULL;
}

这就是我的main 函数,

int main(){
    int dump;
    char str1[100], str2[100], *start;
    printf("Enter 1st String: ");
    scanf("%[^\n]s", str1);
    dump = getchar();
    printf("Enter 2nd String: ");
    scanf("%[^\n]s", str2);
    dump = getchar();

    *start = *mySubStr(str1, str2);

    printf("start: %s\n", start);
}

我确信我像往常一样犯了一些愚蠢的错误,这并不奇怪。

谢谢!

【问题讨论】:

  • Perhas i != '\0' --> *i != '\0'?请不要写i++; count++; q++;之类的东西,如果你写i++; count++; i++;那是正确的,但如果你快速查看它,它看起来像未定义的行为
  • 不,仍然出现同样的错误:/
  • *start = *mySubStr(str1, str2);start = mySubStr(str1, str2);。另外,在打印之前,男性肯定start 不是NULL。别忘了free它。
  • @CoolGuy,解决了谢谢 :) 但为什么它总是返回 NULL 而不是 start
  • 您的代码中还有很多其他问题...您要达到什么目的?而mySubStr需要返回什么?

标签: c pointers function-pointers


【解决方案1】:

您在这一行中有未定义的行为

*start = *mySubStr(str1, str2);

变量start 未初始化,具有不确定的值,因此它几乎可以指向任何地方,而且很可能指向您无法写入的地方。如果mySubStr 返回NULL 则会发生另一个问题,在这种情况下*mySubStr(...) 将取消引用同样未定义的空指针。

你想要的是不是解引用,只是简单的赋值:

start = mySubStr(str1, str2);

请记住在使用指针之前检查返回的空指针,并记住在使用完内存后您需要free


哦,其实不要freemySubStr返回的指针,因为它返回的指针不是你分配的内存,因为

start = i;

丢失你分配的原始指针。

如果您想创建一个全新的字符串,您应该复制您提取的子字符串,您应该在嵌套的while 循环中执行此操作。记得终止字符串。

【讨论】:

    【解决方案2】:

    以下是错误的:

    *start = *mySubStr(str1, str2);
    

    你应该使用:

    start = mySubStr(str1, str2);
    

    此外,作为一种好的做法,您应该将start 初始化为NULL,并在使用它之前测试它的值。此外,main() 返回一个 int,但您在退出时不返回任何值。使用返回值来处理错误和成功条件。

    最后,如果您为start 分配非零空间,您应该在使用完这块内存后对其进行free,以避免泄漏。

    【讨论】:

      【解决方案3】:

      除了其他严重的问题:

      该函数似乎还返回未初始化的内存,在任何时候都没有将任何内容复制到start指向的内存中。

      函数是否缺少从char *searchchar* memory 的复制操作?

      函数中的指针start好像改了然后又返回了。这会导致内存泄漏。

      【讨论】:

        【解决方案4】:

        你的mySubStr() 函数真的很丑,而且格式很难阅读,并且有一些错误,比如i != '\0',如果我理解正确的话,显然必须是*i != '\0',但是最重要的是它总是返回NULL

        尝试解决所有问题

        return start;
        

        而不是

        return NULL;
        

        这意味着printf() 可能正在尝试取消引用NULL 指针。您的mySubStr() 函数正在泄漏start,因为您再也无法free() 它了。还有,这个

        *start = *mySubStr(str1, str2);
        

        错了,您取消了mySubStr() 返回的NULL 指针,并且您没有将指针分配给要从函数返回的子字符串,这只会分配第一个元素。

        您还取消了start 的引用,这是一个未初始化的指针,也是未定义行为的另一个原因。

        【讨论】:

        • 我没有收到任何编译错误,我正在使用gcc
        • @TalhaTemuri 你是对的,你所做的所有事情,即使它们不是你必须做的事情,也永远不会触发警告。
        • 仍然没有警告,它只是告诉我我没有使用dump变量。
        • @TalhaTemuri 是的,我刚刚意识到,但您的scanf() 格式仍然是错误的尝试%[^\n]%*c 并完全删除dump 变量,它会做你想要的。不需要s 那里的%[^\n]s
        • 老兄,我是对的。它应该是i == '\0' 而不是*i == '\0',并且i == '\0' 对我来说工作得很好。是的,它现在返回了我想要的结果。
        【解决方案5】:

        非常感谢所有指出我犯了*start = *mySubStr(str1, str2); 的愚蠢错误的人,尽管这不是我想要的,但我仍然给大家竖起大拇指。当我尽我所能让它发挥作用时,我忘记在此处发布我的问题之前删除*(对不起,我知道我很傻)。

        如果两个字符串匹配,我想从函数mySubStr 返回一个指针,否则NULL。假设我有str1 = "Hello World"str2 = "World",因为str2str1 中,那么它应该返回一个指向str1W 的指针。我希望这是有道理的 :) 这就是我最终能够实现它的方式。

        #include <stdio.h>
        #include <string.h>
        #include <stdlib.h>
        
        char *mySubStr(char *find, char *search);
        char *mySubStr(char *find, char *search){
            char *p, *q, *start;
            int count, i;
            p = find;
            q = search;
            int size = strlen(q);
        
            for (i=0; i < strlen(p); i++){
                count = 0;
                if (p[i] == q[count]){
                    start = &p[i];
                    while(p[i] == q[count]){
                        i++; count++;
                        if(count == size) return start;
                    }
                }
            }
            return NULL;
        }
        
        int main(){
            int dump;
            char str1[100], str2[100], *start;
            printf("Enter 1st String: ");
            scanf("%[^\n]s", str1);
            dump = getchar();
            printf("Enter 2nd String: ");
            scanf("%[^\n]s", str2);
            dump = getchar();
        
            start = mySubStr(str1, str2);
        
            printf("start: %s\n", start);
        }
        

        非常感谢大家:)

        【讨论】:

          猜你喜欢
          • 2012-03-28
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 2013-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多