我无法将从函数返回的字符数组分配给main中的变量。
char *read(char filename[]) {
int i = 0;
am = 0;
char line[80];
char *record[100];
FILE *infile;
infile = fopen(filename, "r");
while (fgets(line, sizeof line, infile) != NULL) {
record[i] = strdup(line);
i++;
am++;
}
return record;
}
...
int main() {
char input[100];
char *record[100];
char input2[100];
char input3[100];
while (1) {
scanf("%[^\n]%*c", &input);
strcpy(input2, strtok(input, " "));
if (strcmp(input2, "print") == 0){
print(record);
...
else if (strcmp(input2, "read") == 0) {
strcpy(input3, strtok(NULL, " "));
record = read(input3); //input3 is the file name
}
return 0;
}
我想采用" read"给出的字符数组。并将其传递给" print",但我没有成功。不会有错误的输入。
编辑:我尝试过动态分配,但我仍然没有得到我想要的东西。我做错了吗?
char* read(char filename[]) {
int i = 0;
am = 0;
char line[80];
char *record = calloc(100, sizeof(char));
if (record == NULL) return NULL;
FILE *infile;
infile = fopen(filename, "r");
while (fgets(line, sizeof line, infile) != NULL) {
printf(line);
record[i] = strdup(line);
i++;
am++;
}
return record;
}
答案 0 :(得分:0)
您的问题是变量record
,声明为char * record[100];
。
当您声明[100]
时,您正在堆栈上创建存储。堆栈存储仅在包含它的函数仍在范围内时才有效。 (例如,您可以将record
向下传递到从read()
内调用的其他函数。)
因此当read()
返回记录时,它返回一个指向数组开头的指针。但是数组本身不再有效,因为read()
- 包含record
的函数 - 不再在范围内。
您可以通过创建record
的文件范围存储(文件范围的变量)版本来解决此问题;或者使用动态分配(例如malloc
或calloc
)在堆上为record
创建存储空间;或者将record
的存储空间从read()
传递到main()
。
通常可以这样做的方法是使用动态分配来创建堆存储,然后返回它。请注意,如果您这样做,则进入所有权语义领域 - 您必须决定谁拥有存储,谁将释放您分配的存储。
另请注意strdup()
本身使用动态内存分配来制作缓冲区的副本。即使你没有意识到,你已经在做一些这样的事了。 : - )