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

时间:2017-08-02 05:23:42

标签: c arrays string pointers

我正在尝试测试一些代码来自" Pointers On C",find_char函数,它搜索指定的字符。我添加了一些我自己的东西,即调用find_char的main()函数,包括要搜索的初始化数据(指向char的指针数组)。我设法在编译时修复所有错误和警告,但在尝试运行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 个答案:

答案 0 :(得分:2)

那么你的问题来自你的外部循环。它遍历数组中的字符串,直到找到NULL字符串。但是,您没有使用此类字符串终止数组,因此循环将在第3个字符串之后继续,并最终尝试访问它不应该访问的内存。

解决问题的方法: 您可以通过为其设置size参数来修改函数的签名,使其成为

int find_char(const **char strs, int size, char ch);

然后,您需要在循环过程中包含此大小值以查找停止条件。

char *s = NULL;
int i = 0;
while (i++ < size && (s = *strs++)) {
    // ...
}

这里需要记住的是,在C编程中,需要仔细使用内存和数组。在处理数组时,通常需要将数组的大小作为参数传递给每个处理函数。

我希望有所帮助。