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
使用完内存后。
哦,其实不要free
mySubStr
返回的指针,因为它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 *search
到 char* memory
的复制操作?
函数中的指针start
好像改了然后returned。这将导致内存泄漏。
非常感谢所有指出我所犯的愚蠢错误的人 *start = *mySubStr(str1, str2);
,尽管这不是我想要的,但我仍然对每个人竖起大拇指。当我尽我所能使它工作时,我忘记在此处发布我的问题之前删除 *
(抱歉,我知道我太傻了)。
如果两个字符串匹配 NULL
,我想 return 来自函数 mySubStr
的指针。假设我有 str1 = "Hello World"
和 str2 = "World"
,因为 str2
在 str1
中,那么它应该 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);
}
非常感谢大家:)
(本人初学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
使用完内存后。
哦,其实不要free
mySubStr
返回的指针,因为它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 *search
到 char* memory
的复制操作?
函数中的指针start
好像改了然后returned。这将导致内存泄漏。
非常感谢所有指出我所犯的愚蠢错误的人 *start = *mySubStr(str1, str2);
,尽管这不是我想要的,但我仍然对每个人竖起大拇指。当我尽我所能使它工作时,我忘记在此处发布我的问题之前删除 *
(抱歉,我知道我太傻了)。
如果两个字符串匹配 NULL
,我想 return 来自函数 mySubStr
的指针。假设我有 str1 = "Hello World"
和 str2 = "World"
,因为 str2
在 str1
中,那么它应该 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);
}
非常感谢大家:)