Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中指针数组的分段错误_C_Arrays_String_Pointers - Fatal编程技术网

C语言中指针数组的分段错误

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

我试图测试“C上的指针”中的一些代码,该函数是find_char函数,用于搜索指定的字符。我添加了自己的东西,即调用find_char并包含要搜索的初始化数据(指向char的指针数组)的main()函数。我设法在编译时修复了所有错误和警告,但在尝试运行a.out文件时,我遇到了分段错误

我知道分段错误主要与数组和指针有关,当类型翻译错误时,常常会发生这种情况。但是我真的找不到我的代码有什么问题

非常感谢你

#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在这方面非常宽容。谢谢你完成我的回答。