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)
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)
...现在你有了存放你想要阅读的所有角色的地方.
string只分配足够的内存来存储一个字符(sizeof(char)).如果要存储更多字符,则需要乘以sizeof(char)要存储的字符串的大小,并在末尾加上一个空格.
代替:
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数组的每个元素都需要足够大以容纳指针.