gpt4 book ai didi

c - 动态分配的数组不会在其声明的函数之外打印

转载 作者:行者123 更新时间:2023-11-30 18:53:21 25 4
gpt4 key购买 nike

该程序将扫描 PGM 文件并将其值存储到动态分配的数组 img函数内部 LerPGM() ,该函数将返回 &img 。正如我声明的PGM *imgconv我分配LerPGM到它(imgconv=LerPGM())。问题是,printf函数内( printf("%d ", img.imagem[i][j]) 工作正常,但 printf("%d ", imgconv->imagem[i][j]) 内的 main() 仅打印第一项,然后程序停止工作。

#include <stdio.h>
#include <stdlib.h>

typedef struct{
int c;
int l;
unsigned char maximo;
unsigned char **imagem;
} PGM;

PGM *LerPGM(char* entrada);

int main()
{
PGM *imgconv;
int i, j;

imgconv=LerPGM("entrada.pgm");
for(i=0; i<imgconv->l; i++){
for(j=0; j<imgconv->c; j++){
printf("%d ", imgconv->imagem[i][j]);
}
printf("\n");
}

return 0;
}

PGM *LerPGM(char* entrada){
PGM img;
char tipo[3];
int i, j;

FILE *arq;
arq = fopen(entrada, "r");
if(arq == NULL){
printf("Arquivo nao encontrado.");
return 0;
}

fscanf(arq, "%s %d %d %d", &tipo, &img.c, &img.l, &img.maximo);
if(strcmp(tipo, "P2")){
printf("O arquivo nao e PGM.");
return 0;
}

img.imagem = malloc(img.l * sizeof(char *));
for(i=0; i<img.c; i++) img.imagem[i] = malloc(img.c * sizeof(char));
if(img.imagem == NULL){
printf("Falha na alocacao de memoria.");
return 0;
}

for(i=0; i<img.l; i++){
for(j=0; j<img.c; j++){
fscanf(arq, "%d", &img.imagem[i][j]);
}
}

fclose(arq);

for(i=0; i<img.l; i++){
for(j=0; j<img.c; j++){
printf("%d ", img.imagem[i][j]);
}
printf("\n");
}

return &img;
}

最佳答案

您正在从函数返回一个指针,但数据位于堆栈上。这就是它不起作用的原因。

  X * func() {
X data;

return &data; /* <<== this is broken. */

}

在我的例子中,当 funcLerPGM 返回时,函数中堆栈中的数据将被销毁。

修复 - 像...之类的东西

PGM *LerPGM(char* entrada){
PGM * img = (PGM*)malloc( sizeof( PGM ) );
char tipo[3];
int i, j;

FILE *arq;
arq = fopen(entrada, "r");
if(arq == NULL){
printf("Arquivo nao encontrado.");
return 0;
}

fscanf(arq, "%s %d %d %d", &tipo, &img->c, &img->l, &img->maximo);
if(strcmp(tipo, "P2")){
printf("O arquivo nao e PGM.");
return 0;
}

img->imagem = malloc(img->l * sizeof(char *));
for(i=0; i<img->c; i++) img->imagem[i] = malloc(img->c * sizeof(char));
if(img->imagem == NULL){
printf("Falha na alocacao de memoria.");
return 0;
}

for(i=0; i<img->l; i++){
for(j=0; j<img->c; j++){
fscanf(arq, "%d", &img->imagem[i][j]);
}
}

fclose(arq);

for(i=0; i<img->l; i++){
for(j=0; j<img->c; j++){
printf("%d ", img->imagem[i][j]);
}
printf("\n");
}

return img;
}

关于c - 动态分配的数组不会在其声明的函数之外打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com