分段错误 - C 编程

Posted

技术标签:

【中文标题】分段错误 - C 编程【英文标题】:Segmentation Fault- C programming 【发布时间】:2014-07-10 21:05:55 【问题描述】:

这个程序应该读取 10 个字符串并打印以“ed”结尾的字符串,但是即使它编译,在我输入第一个字符串后我仍然遇到分段错误。我已经尝试了一切,但我无法弄清楚为什么。这是我的代码:

#include <stdio.h>
#include <string.h>

int main(void)

    //Declaration of array of strings
    char *strings[10];
    int i = 0;
    int len = 0;

    //Prompts user to enter 10 strings

    printf("Enter 10 strings: \n");

    //Loop to read in 10 strings

    for( i = 0; i < 10; i++)
    
        fgets(strings[i], 100, stdin);
    

    //Loop to traverse array of strings and print those ending with 'ed'

    printf("The strings that end with ed are:\n");

    for( i=0; i < 10; i++)
       

        len=strlen(strings[i]);

        len=len-1;

        if(*strings[len] =='e' && *strings[len-1] =='d')
        
            printf("%s", strings[i]);
        
    
    return 0;
//End of function main

【问题讨论】:

你的程序将一个未初始化的指针传递给fgets() char *strings[10]更改为char strings[10][100] fgets 应该写信到哪里?你还没有分配任何东西。 strings[i] 在你的循环之前没有被初始化。 char *strings[10] 不声明字符串数组。它只是声明了一个指向 char * 的指针数组,并且您不会将这些指针初始化为有效内存。因此,当您尝试访问字符串 [0] 时,您会出现段错误! 【参考方案1】:

您尚未为 string 元素分配内存。为它分配内存。

for(int i = 0; i < 10; i++)
    strings[i] = malloc(100);  

最后不要忘记使用free 释放分配的内存。

for(int i = 0; i < 10; i++)
    free(string[i]);  

【讨论】:

【参考方案2】:

没有为字符串变量string 分配内存。你只声明了指向 10 个字符串的指针

char *strings[10];

字符串数组或变量没有内存,因此您必须分配它

 for(i=0;i<10;i++) 
      string[i]=malloc((max_length_of_string));
  

您可以将max_length_of_string 设为 100。

【讨论】:

【参考方案3】:

按以下方式定义数组

char strings[10][100];

另外这段代码sn-p也不正确

for( i=0; i < 10; i++)
   

    len=strlen(strings[i]);

    len=len-1;

    if(*strings[len] =='e' && *strings[len-1] =='d')
    
        printf("%s", strings[i]);
    

试试下面的

for( i=0; i < 10; i++)
   

    len=strlen(strings[i]);

    if ( len && strings[i][len - 1] == '\n' ) --len;

    if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len-2] =='e')
    
        printf("%s", strings[i]);
    

这是程序外观的示例

#include <stdio.h>
#include <string.h>

int main( void )

    //Declaration of array of strings
    const size_t N = 10;
    const size_t M = 100;
    char strings[N][M];
    size_t i;
    size_t len;

    //Prompts user to enter 10 strings

    printf( "Enter %u strings: \n", N );

    //Loop to read in 10 strings

    for ( i = 0; i < N; i++ )
    
        fgets( strings[i], M, stdin );
    

    //Loop to traverse array of strings and print those ending with 'ed'

    printf( "The strings that end with ed are:\n" );

    for ( i = 0; i < N; i++ )
       
        len = strlen( strings[i] );

        if ( len && strings[i][len - 1] == '\n' ) --len;

        if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len - 2] =='e' )
        
            printf( "%s", strings[i] );
        
    

    return 0;

如果输入

apple
room
horse
finished
close
chicken
city
done
success
opened

那么输出将是

finished
opened

【讨论】:

@BLUEPIXY 你确定吗? @VladfromMoscow:是的,因为 len 从 2 递减到 1,所以 len - 2 产生一个负索引。 @BLUEPIXY 哦,我弄错了。谢谢。【参考方案4】:

其中一些问题可能超出了您的项目范围。

您没有为字符串分配任何内存。 您将未初始化的指针传递给fgets()。 您没有充分处理输入字符串过长(超过 99 个字符)的问题。 您没有充分处理输入字符串非常短(少于 2 个字符)的问题。 您没有充分处理输入的数字或字符串少于预期的问题。 您没有充分处理fgets() 的问题,包括结果字符串末尾的输入换行符。 当你的意思是strings[i][len]时,你不正确地使用strings[len]。 您正在检查"de",而不是按预期检查"ed"

以下是解决这些问题的一种可能的解决方案:

int
main (void)

    char *strings[10] = , *x;
    int i;
    size_t len;

    puts("Enter 10 strings:");
    for (i = 0; i < 10; ++i) getline(&strings[i], &len, stdin);
    puts("The strings that end with ed are:");
    for (i = 0; i < 10; ++i) 
        if ((x = strings[i])) 
            len = strlen(x);
            if (x[len-1] == '\n') x[--len] = '\0';
            if (len > 1 && strcmp(x + len - 2, "ed") == 0) puts(x);
            free(x);
        
    
    return 0;

【讨论】:

以上是关于分段错误 - C 编程的主要内容,如果未能解决你的问题,请参考以下文章

带有 std::promise 的 C++11 分段错误

使用 C (Ubuntu) 进行套接字编程中的分段错误

编程求解器的分段错误(核心转储)

在这个涉及结构和指针的 C 编程问题上遇到分段错误

分段错误:11 - C 函数

C函数调用分段错误[重复]