gpt4 book ai didi

c - C 矩阵中指针的练习

转载 作者:行者123 更新时间:2023-11-30 20:30:11 26 4
gpt4 key购买 nike

我试图制作一个程序,用指针在矩阵上创建默认数字,但没有得到结果,没有任何错误。有人可以帮助我吗?我使用“Dev C”作为 IDE。 ...................................................... ...................................................... ......................................

    #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <Math.h>
typedef struct S_Matrice
{
int L;
int C;
int * mat ;
}Matrice;
//creation du matrice
Matrice *CreerMatrice(int l, int c)
{
Matrice *m ;
m = (Matrice *)malloc(sizeof(Matrice)) ;
m->L = l ;
m->C = c ;
m->mat = (int *)malloc(l * c* sizeof(int)) ;
return m;
}
//remplir une matrice
Matrice *remplirMat(int l, int c)
{
Matrice *m ;
m->mat = (int *)malloc(l * c* sizeof(int)) ;
m->L = l ;
m->C = c ;
int i,j;
for(i=0; i < l;i++)
{
for(j=0; j <c; j++)
m->mat=(int *)(rand()%26 + 'a');
}
return m;
}
void afficher(Matrice *m, int l, int c) {
int i, j;
m->L = l ;
m->C = c ;
for (i = 0; i < m->L; i++) {
for (j = 0; j < m->L; j++)
printf("%d ",m);
printf("\n");
}
}

int main() {
int c = 8;
int l = 8;
Matrice *mat= CreerMatrice(c,l);
remplirMat(8,8);
afficher(mat,8,8);
printf("bravo");
getch();
return 0;
}

最佳答案

remplirMat中你有

Matrice *m ;
m->mat = (int *)malloc(l * c* sizeof(int)) ;

m未初始化时,您执行m->mat

缺少 m = (Matrice *)malloc(sizeof(Matrice));

之后:

pi@raspberrypi:/tmp $ ./a.out
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
11972616 11972616 11972616 11972616 11972616 11972616 11972616 11972616
bravo

由于 remplirMat 中的行,所有时间都是相同的值

m->mat=(int *)(rand()%26 + 'a');

您忘记了要存储到保存在m->mat中的已分配数组中的索引ij,可能必须是:

m->mat[i*c +j]=(rand()%26 + 'a');

在你写不好afficher中的矩阵之后

printf("%d ",m);

尝试写入分配的数组地址,需要写入的元素:

printf("%d ",m->mat[i*c +j]);

但只写 0 ...因为在 main 中:

  remplirMat(8,8);

并且填充的矩阵丢失了,一定是

  mat=remplirMat(8,8);

事实上,Matrice *mat= CreerMatrice(c,l); 是无用的,因为分配的矩阵丢失了。可能remplirMat必须获取参数中的矩阵而不是分配一个新的矩阵

所以最好更换:

Matrice *remplirMat(int l, int c)
{
Matrice *m ;
m = (Matrice *)malloc(sizeof(Matrice)) ;
...
return m;
}

void remplirMat(Matrice *m, int l, int c)
{
...
}

当然还有main替换

 Matrice *mat= CreerMatrice(c,l);
mat=remplirMat(8,8);

由 矩阵 *mat= CreerMatrice(c,l);

 remplirMat(mat, 8,8);

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra ma.c
pi@raspberrypi:/tmp $ ./a.out
110 119 108 114 98 98 109 113
98 104 99 100 97 114 122 111
119 107 107 121 104 105 100 100
113 115 99 100 120 114 106 109
111 119 102 114 120 115 106 121
98 108 100 98 101 102 115 97
114 99 98 121 110 101 99 100
121 103 103 120 120 112 107 108
bravo

我鼓励您添加一个FreeMatrice来释放分配的资源

void FreeMatrice(Matrice *m)
{
free(m->mat);
free(m);
}

并在main中调用它,之后:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra ma.c
pi@raspberrypi:/tmp $ valgrind --leak-check=full ./a.out
==12798== Memcheck, a memory error detector
==12798== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==12798== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==12798== Command: ./a.out
==12798==
110 119 108 114 98 98 109 113
98 104 99 100 97 114 122 111
119 107 107 121 104 105 100 100
113 115 99 100 120 114 106 109
111 119 102 114 120 115 106 121
98 108 100 98 101 102 115 97
114 99 98 121 110 101 99 100
121 103 103 120 120 112 107 108
bravo
==12798==
==12798== HEAP SUMMARY:
==12798== in use at exit: 0 bytes in 0 blocks
==12798== total heap usage: 4 allocs, 4 frees, 2,316 bytes allocated
==12798==
==12798== All heap blocks were freed -- no leaks are possible
==12798==
==12798== For counts of detected and suppressed errors, rerun with: -v
==12798== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)

关于c - C 矩阵中指针的练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54842795/

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