【问题标题】:Segmentation fault error with pointer array in CC中指针数组的分段错误错误
【发布时间】:2017-08-02 05:23:41
【问题描述】:

我正在尝试测试“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;
}

【问题讨论】:

  • 如果您要在字符串指针数组中测试空字符串指针,也许您实际上应该在列表末尾放置一个。 IE。 "how are you", NULL。现在你的代码碰到了最后一个字符串(这显然是非空的),然后继续前进到以太中寻找你要求它的确切内容:NULL。
  • 或者将字符串的数量作为参数传递给find_char,例如int find_char( char **strings, size_t n, char value); 并使用 for (size_t i = 0; i &lt; n; i++) 循环或 while (n--) 进行迭代以仅迭代正确数量的指针。

标签: c arrays string pointers


【解决方案1】:

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

您的问题的解决方案: 你可以通过给它一个size 参数来修改你的函数的签名,这样它就变成了

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

那么你需要在循环过程中包含这个大小值来找到你的停止条件。

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

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

希望对你有所帮助。

【讨论】:

  • 或者干脆while (size-- &amp;&amp; (s = *strs++)),或者去掉s,只使用索引,例如for (int i = 0; i &lt; size &amp;&amp; strs[i]; i++)。一切都很好,就像你的回答一样。
  • 是的,有很多方法可以做到这一点。 C 在这方面非常宽容。感谢您完成我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2016-02-24
  • 2012-04-10
相关资源
最近更新 更多