有人可以告诉我为什么我会在这个简单的C程序中出错吗?

use*_*648 4 c malloc segmentation-fault

在我结束第一次循环后,我继续遇到段故障,而对于我的生活,我不知道为什么.我正在扫描的文件只有18行中的18个字符串.我认为问题是我正在使用名为picks的双指针的方式,但我不确切知道为什么.我只是试图扫描长度小于15个字符的字符串,所以我没有看到问题.有人可以请帮助.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 100

int main( int argc,char *argv[] )
{

   char* string = malloc( 15*sizeof(char) );
   char** picks = malloc(15*sizeof(char*));
   FILE* pick_file = fopen( argv[l], "r" );
   int num_picks;


   for( num_picks=0 ; fgets( string, MAX_LENGTH, pick_file ) != NULL ; num_picks++ )
     {
       scanf( "%s", picks+num_picks );
     }
   //this is where i seg fault
   int x;
   for(x=0; x<num_picks;x++)
     printf("s\n", picks+x);
}
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 9

picks 是一个指向指针的指针:这意味着它指向的东西本身就是指针.

当你这样做:

char** picks = malloc(15*sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

你正在picks指向一个15个指针的块 - 尽管它很好(但是,因为你想读18行,你真的需要18个而不是15个).这意味着picks指向内存中的变量块,如下所示:

| picks (char **) | --------> | picks[0] (char *)  | ----> ?
                              | picks[1] (char *)  | ----> ?
                              | picks[2] (char *)  | ----> ?
                              | ...                |
                              | picks[14] (char *) | ----> ?
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,这15个char *指针现在都是非本地化的 - 它们并没有指向任何东西.在为那些人分配一些内存之前,你不能开始使用它们 - 你需要做这样的事情:

int i;
for (i = 0; i < 15; i++)
{
    picks[i] = malloc(15);
}
Run Code Online (Sandbox Code Playgroud)

现在,之后,内存布局如下所示:

| picks (char **) | --------> | picks[0] (char *)  | ----> | picks[0][0] (char)  |
                                                           | picks[0][1] (char)  |
                                                           | ...                 |
                                                           | picks[0][14] (char) |

                              | picks[1] (char *)  | ----> | picks[1][0] (char)  |
                                                           | ...                 |

                              | ...                |
Run Code Online (Sandbox Code Playgroud)

...现在你有了存放你想要阅读的所有角色的地方.

  • 我被ascii表现的诗意美感动了,几乎到了哭泣的地步......为了这个问题可能是这个问题的最后一个化身:) (4认同)

Wil*_*ill 5

  1. string只分配足够的内存来存储一个字符(sizeof(char)).如果要存储更多字符,则需要乘以sizeof(char)要存储的字符串的大小,并在末尾加上一个空格.

  2. 代替:

    char** picks = malloc(15*sizeof(char));
    
    Run Code Online (Sandbox Code Playgroud)

    你想这样做:

    char** picks = malloc(15*sizeof(char*));
    
    Run Code Online (Sandbox Code Playgroud)

    picks数组的每个元素都需要足够大以容纳指针.