C语言中指针数组的分段错误
我试图测试“C上的指针”中的一些代码,该函数是find_char函数,用于搜索指定的字符。我添加了自己的东西,即调用find_char并包含要搜索的初始化数据(指向char的指针数组)的main()函数。我设法在编译时修复了所有错误和警告,但在尝试运行a.out文件时,我遇到了分段错误 我知道分段错误主要与数组和指针有关,当类型翻译错误时,常常会发生这种情况。但是我真的找不到我的代码有什么问题 非常感谢你C语言中指针数组的分段错误,c,arrays,string,pointers,C,Arrays,String,Pointers,我试图测试“C上的指针”中的一些代码,该函数是find_char函数,用于搜索指定的字符。我添加了自己的东西,即调用find_char并包含要搜索的初始化数据(指向char的指针数组)的main()函数。我设法在编译时修复了所有错误和警告,但在尝试运行a.out文件时,我遇到了分段错误 我知道分段错误主要与数组和指针有关,当类型翻译错误时,常常会发生这种情况。但是我真的找不到我的代码有什么问题 非常感谢你 #include <stdio.h> #define TRUE 1 #def
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int find_char( char **strings, char value);
int main(void)
{
int i;
char c = 'z';
char *pps[] = {
"hello there",
"good morning",
"how are you"
};
i = find_char(pps, c);
printf("%d\n", i);
return 0;
}
int find_char (char **strings, char value)
{
char *string;
while (( string = *strings++) != NULL)
{
while (*string != '\0')
{
if( *string++ == value )
return TRUE;
}
}
return FALSE;
}
#包括
#定义真1
#定义FALSE 0
int find_char(字符**字符串,字符值);
内部主(空)
{
int i;
字符c='z';
char*pps[]={
“你好”,
“早上好”,
“你好吗?”
};
i=查找字符(pps,c);
printf(“%d\n”,i);
返回0;
}
int find_char(字符**字符串,字符值)
{
字符*字符串;
while((string=*strings++)!=NULL)
{
而(*字符串!='\0')
{
如果(*字符串+++==值)
返回TRUE;
}
}
返回FALSE;
}
您的问题来自外部while循环。它在数组中的字符串上循环,直到找到NULL
字符串。但是,您没有使用这样的字符串终止数组,因此循环将在第三个字符串之后继续,并最终尝试访问不应该访问的内存
问题的解决方案:
您可以修改函数的签名,方法是给它一个size
参数,使其成为
int find_char(const **char strs, int size, char ch);
然后,您需要在循环过程中包含此大小值,以找到停止条件
char *s = NULL;
int i = 0;
while (i++ < size && (s = *strs++)) {
// ...
}
char*s=NULL;
int i=0;
而(i++
这里要记住的一点是,在C编程中,需要小心地使用内存和数组。处理数组时,通常希望将数组的大小作为参数传递给每个处理函数
我希望这会有所帮助。如果您要在字符串指针数组中测试空字符串指针,也许您应该在列表的末尾添加一个空字符串指针。例如,
“你好吗”,NULL
。现在,您的代码点击最后一个字符串(显然是非空的),然后继续进入以太搜索您要求的内容:空。或者将字符串数作为参数传递给find\u char
,例如int find\u char(char**strings,size\t n,char value)编码>并使用对(size_t i=0;i
循环或while(n--)
只对适当数量的指针进行迭代。或者简单地while(size--&(s=*strs++)
,或者消除s
,只需使用索引,例如对(int i=0;i
。正如你的答案一样,一切都很好。是的,有很多方法可以做到这一点。C在这方面非常宽容。谢谢你完成我的回答。