【发布时间】:2015-08-07 21:42:24
【问题描述】:
我正在尝试学习 C,尤其是指针和 malloc()。我编写了以下程序,需要对我收到的警告消息和输出进行一些说明。
#include<stdio.h>
#include<stdlib.h>
void printem(char *ptr, char loopagain)
{
int i;
for (i = 0; i < loopagain; i++)
{
printf("Found %c at address %c \n",ptr[i],&ptr[i]);
}
return;
}
void initializeblock(char *ptr, char loopagain)
{
int i;
for (i = 0; i < loopagain; i++)
{
ptr[i] = 65+i;
}
return;
}
int main()
{
char neededbytes = 10;
char *p;
p = (char *) malloc(neededbytes * sizeof(char));
if(p==NULL)
{
printf("Error! memory not allocated.");
exit(0);
}
else
{
printem(p,neededbytes);
initializeblock(p,neededbytes);
printem(p,neededbytes);
}
free(p);
}
我遇到的第一个问题是我没有将 10 个字符元素中的每一个的地址正确打印为数字。我得到符号而不是数字。这是打印出值和地址的代码行。
printf("Found %c at address %c \n",ptr[i],&ptr[i]);
我做错了什么?
第二个问题在 else 语句里面我有以下代码
printem(p,neededbytes);
initializeblock(p,neededbytes);
printem(p,neededbytes);
最初我在 p 之前使用 & 但收到以下警告
[警告] 从不兼容的指针类型传递“printem”的参数 1
[注意] 预期为 'char *' 但参数类型为 'char **'
我在网上找到的示例表明,期望指针的函数应该将地址传递给它,为什么我在使用时会收到警告
printem(&p,neededbytes);
initializeblock(&p,neededbytes);
printem(&p,neededbytes);
另外,当我使用malloc() 分配块时,除了使用数组括号p[i]之外,还有其他方法可以访问/修改数据吗?
有没有办法知道分配的块的大小,所以我不必在下一行将它作为参数传递
printem(p,neededbytes);
【问题讨论】:
-
...and here's why.
-
你需要 %p 来打印指针地址,而不是 %c。
-
关于分配内存块的最后一个问题,请阅读this SO QA