动态内存分配问题
Dynamic memory allocation issue
一段时间以来,我一直在努力使这个 C 程序运行,但在内存分配方面我仍然遇到了一些大麻烦。这项工作的要点是它应该从文件的第一行读取一个字符串,然后从第二行读取 2 个数字,然后是 3 个列向量,每个列向量的成员数是两个读取数字之间的差值的三倍.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void read(char **banda, int *s, int *sf, int **vs, char **vcs, char **vd)
{
FILE *fin;
int i;
fin = fopen("date.in", "r");
*banda = (char*)malloc(50*sizeof(char));
fgets(*banda, 50, fin);
fscanf(fin, "%d", s);
fscanf(fin, "%d", sf);
fseek( fin, 1, SEEK_CUR );
int l = 3* ( (*s)-(*sf) );
*vcs = (char*) malloc( l * sizeof(char) );
*vd = (char*) malloc( l *sizeof(char) );
*vs = (int*) malloc( l * sizeof(int) );
for( i = 0; i< l ; i++ )
{
fscanf(fin, "%d", vs[i]);
fscanf(fin, " %c", vcs[i]);
fscanf(fin, " %c", vd[i]);
fseek( fin, 1 , SEEK_CUR );
}
fclose(fin);
}
int main()
{
char *banda;
int i;
int s, sf;
char *vcs;
char *vd;
int *vs;
read(&banda, &s, &sf, &vs, &vcs, &vd);
for( i = 0; i < strlen(banda) ; i++ )
{
printf("%c", banda[i]);
}
printf("%d %d\n", s, sf);
for( i = 0; i < 3*(s-sf) ; i++ )
{
printf("%d %c %c\n", vs[i], vcs[i], vd[i]);
}
}
Example input:
Helen
2 1
1 H A
2 B C
5 K I
但是,我似乎无法为其分配内存。如果我超过 i=0(也就是数组中的第一个位置),程序会显示一个整洁的 "Segmentation fault"。但是,如果我只为每个数组写入一个值,它就不会崩溃。我严重遗漏了一些东西,我就是想不通。
问题出在这里:
fscanf(fin, "%d", vs[i]);
fscanf(fin, " %c", vcs[i]);
fscanf(fin, " %c", vd[i]);
变量vs
、vcs
和vd
是指向数组的指针。在这里,您将它们视为指针数组。您需要先取消引用指针,然后获取要写入的数组元素,然后取其地址:
fscanf(fin, "%d", &(*vs)[i]);
fscanf(fin, " %c", &(*vcs)[i]);
fscanf(fin, " %c", &(*vd)[i]);
一段时间以来,我一直在努力使这个 C 程序运行,但在内存分配方面我仍然遇到了一些大麻烦。这项工作的要点是它应该从文件的第一行读取一个字符串,然后从第二行读取 2 个数字,然后是 3 个列向量,每个列向量的成员数是两个读取数字之间的差值的三倍.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void read(char **banda, int *s, int *sf, int **vs, char **vcs, char **vd)
{
FILE *fin;
int i;
fin = fopen("date.in", "r");
*banda = (char*)malloc(50*sizeof(char));
fgets(*banda, 50, fin);
fscanf(fin, "%d", s);
fscanf(fin, "%d", sf);
fseek( fin, 1, SEEK_CUR );
int l = 3* ( (*s)-(*sf) );
*vcs = (char*) malloc( l * sizeof(char) );
*vd = (char*) malloc( l *sizeof(char) );
*vs = (int*) malloc( l * sizeof(int) );
for( i = 0; i< l ; i++ )
{
fscanf(fin, "%d", vs[i]);
fscanf(fin, " %c", vcs[i]);
fscanf(fin, " %c", vd[i]);
fseek( fin, 1 , SEEK_CUR );
}
fclose(fin);
}
int main()
{
char *banda;
int i;
int s, sf;
char *vcs;
char *vd;
int *vs;
read(&banda, &s, &sf, &vs, &vcs, &vd);
for( i = 0; i < strlen(banda) ; i++ )
{
printf("%c", banda[i]);
}
printf("%d %d\n", s, sf);
for( i = 0; i < 3*(s-sf) ; i++ )
{
printf("%d %c %c\n", vs[i], vcs[i], vd[i]);
}
}
Example input:
Helen
2 1
1 H A
2 B C
5 K I
但是,我似乎无法为其分配内存。如果我超过 i=0(也就是数组中的第一个位置),程序会显示一个整洁的 "Segmentation fault"。但是,如果我只为每个数组写入一个值,它就不会崩溃。我严重遗漏了一些东西,我就是想不通。
问题出在这里:
fscanf(fin, "%d", vs[i]);
fscanf(fin, " %c", vcs[i]);
fscanf(fin, " %c", vd[i]);
变量vs
、vcs
和vd
是指向数组的指针。在这里,您将它们视为指针数组。您需要先取消引用指针,然后获取要写入的数组元素,然后取其地址:
fscanf(fin, "%d", &(*vs)[i]);
fscanf(fin, " %c", &(*vcs)[i]);
fscanf(fin, " %c", &(*vd)[i]);