作者mouwat (QQ)
看板C_and_CPP
标题[问题] 使用双重指标的题目有问题
时间Wed Sep 2 10:47:23 2020
不好意思又来麻烦大家指点
题目是codewar使用双重指标的问题
使用C语言
https://www.codewars.com/kata/534d2f5b5371ecf8d2000a08/train/c
我查询双重指标的使用方法後试着写了却出不来结果
参考内容
https://imgur.com/B2gM9rm.jpg
写了以下的code
https://ideone.com/sQjKpG
显示结果
https://imgur.com/kfjG0FH.jpg
之前发生类似的问题通常是宣告范围有问题...
有请写C++朋友帮看一下 但他说不太熟这部分
烦请指点迷津
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.71.13.253 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1599014848.A.740.html
1F:→ Lipraxde: 你看看人家 tmp malloc 写在哪?你写在哪? 09/02 11:24
先谢谢你肯花时间帮我看
不过我其实是有照抄过的,也会有一样的结果
https://imgur.com/2fYvtAH.jpg
後来会改用这样写是因为在参考其他人解答时,看起来可以这样宣告
https://imgur.com/wYGnH8p.jpg
怎样宣告才是没有问题的,也希望不吝指教,谢谢
2F:→ Lipraxde: 啊...我看错惹... 09/02 11:36
3F:→ Lipraxde: 我看题目的意思应该是要你帮每个 row 都 allocate 一块 09/02 11:38
4F:→ Lipraxde: 空间,不过你是 allocate 一整块。所以在它 free memor 09/02 11:38
5F:→ Lipraxde: y 的阶段会出错 09/02 11:38
请问你的意思是,虽然我参考的网页用了这两种宣告记忆体的方式去说明双重指标
但是这两种方式使用上还是会有甚麽差异是吗
有可能因为验证的程式码的关系,我只能用另一种方式宣告这样吗
※ 编辑: mouwat (118.163.136.235 台湾), 09/02/2020 12:04:00
6F:→ sarafciel: 因为他test的部分free是每条row分开free的 09/02 12:07
7F:→ sarafciel: 你直接alloc一整块出来就会变成double free 09/02 12:08
8F:→ Lipraxde: 题目的 note 意思就是要你这样 allocate memory。 09/02 12:29
9F:→ Lipraxde: 并不是 double free。第一个 row 以外的 rows 指到的是 09/02 12:29
10F:→ Lipraxde: tmp 加一个偏移量的位置,free 的时候由於这些 pointe 09/02 12:29
11F:→ Lipraxde: rs 不是 allocate 出来的,所以会出现 invalid pointer 09/02 12:29
12F:→ Lipraxde: 的错误 09/02 12:29
请问这个错误的原因是我下面提到的吗
如果不是的话是否能麻烦你说得再详细一点呢
13F:→ sarafciel: 啊对,这个不算double free,感谢指正XD 09/02 13:11
因为我目前写题目而以没用过free,刚查了一下再请教一下
1. 如果我现在是用一开始的宣告方式
int **feeback, *tmp;
feeback=(int**)calloc(n,sizeof(int*));
tmp=(int*)calloc(n*n,sizeof(int));
那是否在free的时候是这样做
free(feeback);
free(tmp);
2. 如果我是用先宣告行再宣告列的方式
int **feeback=calloc(n,sizeof(int*))
for(i=0;i<n;i++)
feeback[i]=(int)calloc(n,sizeof(int));
那是否在free的时候是这样做
for(i=0;i<n;i++)
free(feeback[i]);
free(feeback);
3. 另外想问一下格式问题
int **feeback=
(int**)calloc(n,sizeof(int*));
feeback=
(int**)calloc(n,sizeof(int*));
黄色部分的意义跟必要性是...?
有的有加有的没加,我有点不太确定
再麻烦指教了
※ 编辑: mouwat (118.163.136.235 台湾), 09/02/2020 15:05:35
14F:→ loveme00835: 需要加的不是 C 语言 09/02 15:06
不好意思,这句不太懂...
15F:→ loveme00835: malloc()/calloc() 完以後会回传的指标, 而这些指标 09/02 15:10
16F:→ loveme00835: 就是需要给 free() 的引数, 所以呼叫次数先要对得上 09/02 15:10
17F:→ loveme00835: 才行, 这是大原则. 09/02 15:10
请问你的意思是我第二项要加上红字部分才对吗
我宣告了一次作为col,又以col各element宣告了一次row
所以我要先free掉row,再free掉col
这样对吗?
另外也请问第一项free的对吗
※ 编辑: mouwat (118.163.136.235 台湾), 09/02/2020 15:27:15
※ 编辑: mouwat (118.163.136.235 台湾), 09/02/2020 15:59:27
18F:→ Lipraxde: 你可以自己写几只程式後用 valgrind 跑,valgrind 会告 09/02 17:56
19F:→ Lipraxde: 诉哪边对记忆体的操作有问题 09/02 17:56
这个好像只有linux上可以用,大家一般写完code都会用这个检查吗?
20F:→ loveme00835: 为什麽你在呼叫函式以前不先看它的说明, 而是靠别人 09/03 05:37
21F:→ loveme00835: 写的程式码来猜用途? 09/03 05:37
我是看完书以後试解题目,解不出来参考别人解答,常常有看不懂的东西
22F:嘘 reemir: 什麽叫做双重指标?有这种东西吗? 09/22 10:06
google很容易找到喔,我也没在学校学过C的课程
如果你想展现用语的正统性,是不是可以多叙述一些指点一二呢
※ 编辑: mouwat (114.137.68.42 台湾), 10/01/2020 23:36:11
23F:推 Matz: 是指标的指标吧 03/14 19:18