关于生成不定长的二维数组的两个疑问(详见贴内)
#include <stdio.h>#include <malloc.h>
int main()
{
int **p;
int n=0;
printf("请输入矩阵阶数");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
p=(int**)malloc(sizeof(int)*n);
}
for(int i=0;i<n;i++)
{
*(p+i)=(int*)malloc(sizeof(int)*n);
//问题一、这里使用
//*p++=(int*)malloc(sizeof(int)*n);不可以why?
//*p=(int*)malloc(sizeof(int)*n);p++ 也不可以why?
//使用 p=(int*)malloc(sizeof(int)*n);可以
//使用 *(p+i)=(int*)malloc(sizeof(int)*n); 可以
}
int m=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
p=m;
//问题二
//这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
++m;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",p);
}
printf("\n");
}
return 0;
} 没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输出什么?
输入3?
输入4?
输入0可不可以?
就是贴一下这个程序的输入/输出
这样?
#include <stdio.h>
#include <malloc.h>
int main() {
int **p;
int n = 0;
//printf("请输入矩阵阶数");
//scanf("%d", &n);
n = 2;
/*
// 这个for循环是在做什么?
for(int i = 0; i < n; i++) {
p = (int **)malloc(sizeof(int) * n);
}
*/
//p = malloc(sizeof(int *) * n);
p = malloc(sizeof(*p) * n);
for(size_t i = 0; i < n; ++i) {
p = malloc(sizeof(*p) * n);
}
// ok
#if 0
p = malloc(sizeof(*p) * n);
int **bak = p;
for(size_t i = 0; i < n; ++i) {
*p++ = malloc(sizeof(*p) * n);
}
p = bak;
#endif
// ok
#if 0
p = malloc(sizeof(*p) * n);
int **bak = p;
for(size_t i = 0; i < n; ++i) {
*p = malloc(sizeof(*p) * n);
++p;
}
p = bak;
#endif
#if 0
for(int i = 0; i < n; i++) {
*(p + i) = (int *)malloc(sizeof(int) * n);
//问题一、这里使用
//*p++=(int*)malloc(sizeof(int)*n);不可以why?
//*p=(int*)malloc(sizeof(int)*n);p++ 也不可以why?
//使用 p=(int*)malloc(sizeof(int)*n);可以
//使用 *(p+i)=(int*)malloc(sizeof(int)*n); 可以
}
#endif
int m = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
*(*(p + i) + j) = m;
//p = m;
//问题二
//这里要使用*p+x 方式 该如何修改 ,自己改了半天
//也不知道用指针咋能寻址
++m;
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%4d", p);
}
printf("\n");
}
// 释放内存
// 一定一定一定不要忘了
for(size_t i = 0; i < n; ++i) free(p);
free(p);
return 0;
}
#include <stdio.h>
#include <malloc.h>
int main() {
int **p;
int n = 0;
//printf("请输入矩阵阶数");
//scanf("%d", &n);
n = 2;
/*
// 这个for循环是在做什么?
for(int i = 0; i < n; i++) {
p = (int **)malloc(sizeof(int) * n);
}
*/
// ok
#if 0
//p = malloc(sizeof(int *) * n);
p = malloc(sizeof(*p) * n);
for(size_t i = 0; i < n; ++i) {
p = malloc(sizeof(*p) * n);
}
#endif
// ok
#if 0
p = malloc(sizeof(*p) * n);
typeof(p) bak = p;
for(size_t i = 0; i < n; ++i) {
*p++ = malloc(sizeof(*p) * n);
}
p = bak;
#endif
// ok
#if 1
p = malloc(sizeof(*p) * n);
typeof(p) bak = p;
for(size_t i = 0; i < n; ++i) {
*p = malloc(sizeof(*p) * n);
++p;
}
p = bak;
#endif
#if 0
for(int i = 0; i < n; i++) {
*(p + i) = (int *)malloc(sizeof(int) * n);
//问题一、这里使用
//*p++=(int*)malloc(sizeof(int)*n);不可以why?
//*p=(int*)malloc(sizeof(int)*n);p++ 也不可以why?
//使用 p=(int*)malloc(sizeof(int)*n);可以
//使用 *(p+i)=(int*)malloc(sizeof(int)*n); 可以
}
#endif
int m = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
*(*(p + i) + j) = m;
//p = m;
//问题二
//这里要使用*p+x 方式 该如何修改 ,自己改了半天
//也不知道用指针咋能寻址
++m;
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%4d", p);
}
printf("\n");
}
// 释放内存
// 一定一定一定不要忘了
for(size_t i = 0; i < n; ++i) free(p);
free(p);
return 0;
}
人造人 发表于 2022-5-18 17:20
没看懂你的代码,这个程序如何使用?
这个代码可以输入1吗?输入1会输出什么?
可不可以输入2?输入2会输 ...
我就是创建一个动态二维数组,然后再随便初始化一下,然后再输出,需求简单的狠
而且我也做出来了,只不过想把下标遍历方式变成用指针遍历 wp231957 发表于 2022-5-18 18:06
我就是创建一个动态二维数组,然后再随便初始化一下,然后再输出,需求简单的狠
而且我也做出来了,只不 ...
*p+x
是不是想变二维赋值为一维赋值
试试
*((int*)p+x)=m;
本帖最后由 风车呼呼呼 于 2022-5-18 19:35 编辑
问题一:p指向所申请的内存空间,p一动(而且最后也不还原)那不是妥妥的内存泄漏
问题二:见代码
#include <stdio.h>
int main(void) {
int** p, n, num = 0;
printf("请输出矩阵阶数:");
scanf("%d", &n);
printf("正在生成%d阶矩阵!\n", n);
p=(int **)malloc(sizeof(p)*n);
for (int i = 0; i < n; i++) {
*(p + i) = (int *)malloc(sizeof(int) * n);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
*(*(p + i) + j) = num++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", *(*(p + i) + j));
}
putchar('\n');
}
for (int i = 0; i < n; i++) {
free(*(p + i));
}
free(p);
return 0;
} 本帖最后由 jhq999 于 2022-5-18 19:48 编辑
int **p,*ptmp=NULL;
int n=0;
printf("请输入矩阵阶数");
scanf("%d",&n);
p=(int**)malloc(sizeof(int*)*n);
ptmp=(int*)malloc(sizeof(int)*n*n);
for(int i=0;i<n;i++)
{
*(p+i)=ptmp+i*n;
//问题一、这里使用
//*p++=(int*)malloc(sizeof(int)*n);不可以why?
//*p=(int*)malloc(sizeof(int)*n);p++ 也不可以why?
//使用 p=(int*)malloc(sizeof(int)*n);可以
//使用 *(p+i)=(int*)malloc(sizeof(int)*n); 可以
}
int m=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
*(*(p+i)+j)=m;
//问题二
//这里要使用*p+x 方式 该如何修改 ,自己改了半天 也不知道用指针咋能寻址
++m;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",p);
}
printf("\n");
}
free(ptmp);
free(p); jhq999 发表于 2022-5-18 19:43
可是我还是不知道
*(p + i) = (int *)malloc(sizeof(int) * n);
和
*(p ++) = (int *)malloc(sizeof(int) * n);
有啥区别???他们不一样吗 本帖最后由 jhq999 于 2022-5-19 08:55 编辑
wp231957 发表于 2022-5-19 08:41
可是我还是不知道
*(p + i) = (int *)malloc(sizeof(int) * n);
和
可以,
完成后
别忘了
p=p-n;
让p等于原来的首地址 jhq999 发表于 2022-5-19 08:53
可以,
完成后
别忘了
嗯,实践了,确实可以
但是又遇到难点了
int m=1;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
*(p+i)=m++; //这里准备用指针和数组的结合体代替p或者*(*(p+i)+j) 但是失败,是不能这样结合吗
}
} wp231957 发表于 2022-5-19 09:08
嗯,实践了,确实可以
但是又遇到难点了
#include <stdio.h>
#include <malloc.h>
int main() {
int **p;
int n = 0;
//printf("请输入矩阵阶数");
//scanf("%d", &n);
n = 2;
/*
// 这个for循环是在做什么?
for(int i = 0; i < n; i++) {
p = (int **)malloc(sizeof(int) * n);
}
*/
// ok
#if 0
//p = malloc(sizeof(int *) * n);
p = malloc(sizeof(*p) * n);
for(size_t i = 0; i < n; ++i) {
p = malloc(sizeof(*p) * n);
}
#endif
// ok
#if 0
p = malloc(sizeof(*p) * n);
typeof(p) bak = p;
for(size_t i = 0; i < n; ++i) {
*p++ = malloc(sizeof(*p) * n);
}
p = bak;
#endif
// ok
#if 1
p = malloc(sizeof(*p) * n);
typeof(p) bak = p;
for(size_t i = 0; i < n; ++i) {
*p = malloc(sizeof(*p) * n);
++p;
}
p = bak;
#endif
#if 0
for(int i = 0; i < n; i++) {
*(p + i) = (int *)malloc(sizeof(int) * n);
//问题一、这里使用
//*p++=(int*)malloc(sizeof(int)*n);不可以why?
//*p=(int*)malloc(sizeof(int)*n);p++ 也不可以why?
//使用 p=(int*)malloc(sizeof(int)*n);可以
//使用 *(p+i)=(int*)malloc(sizeof(int)*n); 可以
}
#endif
int m = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
//*(*(p + i) + j) = m;
(*(p + i)) = m++;
//p = m;
//问题二
//这里要使用*p+x 方式 该如何修改 ,自己改了半天
//也不知道用指针咋能寻址
//++m;
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%4d", p);
}
printf("\n");
}
// 释放内存
// 一定一定一定不要忘了
for(size_t i = 0; i < n; ++i) free(p);
free(p);
return 0;
}
人造人 发表于 2022-5-19 09:28
哦,还得括一下才行啊 wp231957 发表于 2022-5-19 09:41
哦,还得括一下才行啊
所以别嫌麻烦,运算顺序的问题,总比出bug强
页:
[1]