c - 在另一个函数中使用创建结构函数会关闭程序。有小费吗?

标签 c structure dynamic-memory-allocation

这段代码应该与二维矩阵一起工作,因为它们是一个单一的数组。我必须转置输入矩阵。转置、打印和读取值的代码都可以,但我无法使用该函数创建一个新矩阵来将转置值放在那里。这是代码:

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

struct Matriz {
int *p;
int lin, col, N;
};
typedef struct Matriz Matriz;

Matriz* CriaMatriz (int nlinhas, int ncolunas){
int tam=(nlinhas)*(ncolunas);
Matriz *a;
(*a).p=malloc(tam*sizeof(int));
(*a).col=ncolunas;
(*a).lin=nlinhas;
(*a).N=tam;
return a;
}

Matriz* TranspoeMatriz (Matriz *m){
int a=(*m).col;
int b=(*m).lin;

Matriz *t=CriaMatriz(a,b);  //THE PROBLEM HAPPENS HERE AND ALL THE PROGRAM SHUT DOWN

//some code

return t;   
}

int main(){
int o,p;
scanf("%d%d",&o,&p);

Matriz *g=CriaMatriz(o,p);
Matriz *tra=TranspoeMatriz(g);
}

我尝试用这个替换出现问题的行:

Matriz *t;
(*t).p=malloc((a*b)*sizeof(int));
(*t).col=b;
(*t).lin=a;
(*t).N=a*b;

一切顺利,但我必须使用 CriaMatriz 函数来创建新的 Matriz 结构。我使用了很多 printf 来查找程序停止的位置,并且我遗漏了一堆打印代码输出的函数以及带有 scanf 的函数。

最佳答案

您必须分配内存才能创建 Matrix 实体:

Matriz *a;
a = (Matriz*) malloc(sizeof(Matriz));

关于c - 在另一个函数中使用创建结构函数会关闭程序。有小费吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27305117/

相关文章:

c - 结构中变量 char 的大小 (C ANSI)

c# - C# 字节数组中的 RAWINPUT RAWHID 结构

c - 使用 realloc() 时的 SIGABRT

c++ - fprintf()/std::cout 不会将字符串的一部分打印到 stdout/stderr

objective-c - c风格的指针和id风格的对象有什么区别?

代码可以运行,但有一些小错误,我不知道它在哪里?

c++ - 当使用大于 3000 万的数据输入大小时,程序不会将数据输出到控制台

c - 以太大的值执行 fseek 后位置指示符在哪里

c - 让每个进程并行发送一组数据并从所有其他进程接收数据的最佳方式。 MPI

c++ - 为什么在这种情况下 memset 会失败?