Return C 中的指针(段错误故障排除)

Return a Pointer in C (Segment Fault Troubleshoot)

(本人初学c语言)

我正在尝试 return 来自函数的指针,但出现 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 != '[=11=]'; 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);
}

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

谢谢!

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

*start = *mySubStr(str1, str2);

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

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

start = mySubStr(str1, str2);

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


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

start = i;

丢失你分配的原始指针。

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

你的 mySubStr() 函数真的很难看,而且格式很难读,而且有一些错误,比如 i != '[=14=]' 如果我理解正确,但 最重要的是它总是 RETURNS NULL.

尝试解决所有问题

return start;

而不是

return NULL;

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

*start = *mySubStr(str1, str2);

是错误的,您正在取消引用 mySubStr() 编辑的 NULL 指针 return 并且您没有将指针分配给您想要 return 的子字符串函数,这只会分配第一个元素。

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

的另一个原因

以下是错误的:

*start = *mySubStr(str1, str2);

你应该使用:

start = mySubStr(str1, str2);

此外,作为一个好的习惯,您应该在使用前将 start 初始化为 NULL 并测试其值。此外,main() return 是 int,但您在退出时没有 return 任何值。使用 return 值来处理错误和成功条件。

最后,如果您为 start 分配非零值 space,您应该在用完这块内存后 free 它,以避免泄漏。

此外还有其他严重问题:

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

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

函数中的指针start好像改了然后returned。这将导致内存泄漏。

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

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

#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);
}

非常感谢大家:)