指针数组初始化问题

junhao051 2010-02-09 02:52:09
我想定义一个指针数组(虽然很少人用这个东西),那么,对这个指针的初始化怎么做?
char* pstr[5];
int i = 0;
for(i = 0; i < 5; i++)
{
pstr[i] = (char*)malloc(sizeof(char)*32);
}
上面是我想的一种办法,想有没有更优化的做法,比如在定义的时候直接给动态分配空间?期望各位的答复。
今天学指针兴趣大增啊!
...全文
23611 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
babyblue1986 2012-09-22
  • 打赏
  • 举报
回复
Lz问的是指针数组啊,锅锅们 你们怎么都围绕着6楼的数组指针来讨论咧 牛头不对马嘴
asd320678 2012-08-28
  • 打赏
  • 举报
回复
大佬们好歹运行一下,虽然有自信,但是也不要一不小心误人子弟,回复了就算是半个师傅,但是可别教坏了徒弟.
六楼的代码有问题,却很多人支持,可见这些人都"学"到不少东西.
#include <stdio.h>
#include <stdlib.h> //malloc的头文件
int main()
{
char (*pstr)[5] = (char(*)[5])malloc(32*5*sizeof(char));//malloc前需要对返回值类型进行强制转换
free(pstr);
return 0;
}
gw_cs 2012-07-16
  • 打赏
  • 举报
回复
6楼那么大一个错误还给分么?

楼主问的是指针数组,然后六楼给了个数组指针。
nohack315 2011-07-13
  • 打赏
  • 举报
回复
怎么不用memset 呢
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 chengzhe 的回复:]
没问题, 很正常

但是堆空间一般是用时才申请的, 所以初始化可以变成char* p[22] = {NULL}
[/Quote]
说的好,我一般也这么用。
penghaibo203 2010-10-27
  • 打赏
  • 举报
回复 1

#include <stdio.h>
int main()
{
char (*pstr)[5] = malloc(32*5*sizeof(char));
free(pstr);
return 0;
}
bladesoft 2010-02-10
  • 打赏
  • 举报
回复
快捷的方法没有,就楼主自己的方法了
linuxcmhp 2010-02-10
  • 打赏
  • 举报
回复
学习中...... 不错的文章!
qizhi0119 2010-02-10
  • 打赏
  • 举报
回复
引用 7 楼 junhao051 的回复:
引用 3 楼 guzhijie1981 的回复:看你想做什么;如果是我 char *p[4] ={0}; 以后用到再说;
我就想对这个指针数组的每个指针都给个动态分配,省得是个野指针,出问题该头疼了。

这样相当于把指针数组的每个指针都指向0地址了,即NULL,已经不是野指针了.可以到时候用到再说了啊.
用完所free后别忘了置成NULL这样就不会出现野指针现象了.
tbwork 2010-02-09
  • 打赏
  • 举报
回复
lz的方法是可取的
1.在确定了数组的每个维数的长度后可以直接用char pstr[][]
2.不确定长度的情况下,就用你方法解决【循环初始化】,其他方法,我也没遇到过,C++也是如此
junhao051 2010-02-09
  • 打赏
  • 举报
回复
动态分配。刚打错了。
junhao051 2010-02-09
  • 打赏
  • 举报
回复
引用 11 楼 yzx714 的回复:
引用 10 楼 junhao051 的回复:引用 6 楼 mstlq 的回复: C/C++ code #include<stdio.h>int main() {char (*pstr)[5]= malloc(32*5*sizeof(char)); free(pstr);return0; } 这个好,把二维数组直观化了。但使用了malloc就得手动调用free,这个工作量可不小~

如果没记错的话,用数组定义的指针,应该是静态指针吧,动态分布的指针却很灵活,可以随意修改。
junhao051 2010-02-09
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
char* pstr[5];
int i;
for (i=0;i <5;i++) {
    pstr[i]=(char*)malloc(sizeof(char)*32);
}
...
for (i=0;i <5;i++) {
  free(pstr[i]);
}

//想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
//从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

//VC6调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。

char* pstr[5];
int i;
pstr[0]=(char*)malloc(sizeof(char)*32*5);
for (i=1;i <5;i++) {
    pstr[i]=pstr[0]+32*i;
}
...
free(pstr[0]);

这话说得有道理,能在本质上,看到这些个东西的运行过程,的确是件高兴的事儿,看来我得下狠心把汇编再看看了,记得好像还留着汇编的书。
chengzhe 2010-02-09
  • 打赏
  • 举报
回复
没问题, 很正常

但是堆空间一般是用时才申请的, 所以初始化可以变成char* p[22] = {NULL}
yzx714 2010-02-09
  • 打赏
  • 举报
回复
引用 18 楼 mstlq 的回复:
引用 16 楼 yzx714 的回复:
惊喜发现mstlq 6楼的代码竟然有内存泄漏!
这是我看到mstlq犯的第一个错误~

我又重新看了一遍
对不起,没有泄漏……
一次malloc对应一次free,很正常……
我也重新看一遍,果然没有…………刚才看错了……
mstlq 2010-02-09
  • 打赏
  • 举报
回复
引用 16 楼 yzx714 的回复:
惊喜发现mstlq 6楼的代码竟然有内存泄漏!
这是我看到mstlq犯的第一个错误~


我又重新看了一遍
对不起,没有泄漏……
一次malloc对应一次free,很正常……
M0521 2010-02-09
  • 打赏
  • 举报
回复
既然定义为数组 用malloc 申请内存有点多余
这样就可以了
char * xxx[N]={0,};
yzx714 2010-02-09
  • 打赏
  • 举报
回复
惊喜发现mstlq 6楼的代码竟然有内存泄漏!
这是我看到mstlq犯的第一个错误~
ksjun 2010-02-09
  • 打赏
  • 举报
回复
哈哈,看過了。。。。
yzx714 2010-02-09
  • 打赏
  • 举报
回复
指针很简单,不过是一种数据类型而已,表示内存地址
加载更多回复(13)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧