搜索
查看: 2033|回复: 15
打印 上一主题 下一主题

学习指针中,这样写为什么会内存错误?

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-17 11:29:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
学习指针中,这样写为什么会内存错误?编译通过了,是不是数组下标的问题?求教~
#include <stdio.h>
#include <stdlib.h>
int main()
{
void c(int*[5]);
int *a,b[5],i;
c(&b);
   for(i=0;i<5;i++)
   {
   printf("%d",b[i]);
   }
   
   
system("pause");
return 0;
}
void c(int *a[5])
{
*a[1]=1000;
*a[2]=1000;  
*a[3]=1000;
*a[4]=1000;
*a[5]=1000;
}

最佳答案

查看完整内容

因为你没搞清楚一些概念 int(*a)[5]和int*a[5]有什么区别要先想清楚 你要的代码应该是这样子的
沙发
发表于 2013-7-17 11:29:42 | 只看该作者
因为你没搞清楚一些概念
int(*a)[5]和int*a[5]有什么区别要先想清楚
你要的代码应该是这样子的
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void c(int(*)[5]);
  4. int main()
  5. {

  6. int b[5],i;
  7. c(&b);
  8.    for(i=0;i<5;i++)
  9.    {
  10.    printf("%d",b[i]);
  11.    }
  12.    
  13.    
  14. system("pause");
  15. return 0;
  16. }
  17. void c(int (*a)[5])
  18. {
  19. (*a)[1]=1000;
  20. (*a)[2]=1000;  
  21. (*a)[3]=1000;
  22. (*a)[4]=1000;
  23. (*a)[0]=1000;
  24. }
复制代码
板凳
发表于 2013-7-18 15:08:58 | 只看该作者
rosynirvana 发表于 2013-7-17 12:57
因为你没搞清楚一些概念
int(*a)[5]和int*a[5]有什么区别要先想清楚
你要的代码应该是这样子的

我弱弱的问下,之前没有定义过a[5]数组的情况下,*a[5]是没意义的吧?编译器不知道是啥意思吧
地板
发表于 2013-7-18 15:10:10 | 只看该作者
90°C 发表于 2013-7-18 15:08
我弱弱的问下,之前没有定义过a[5]数组的情况下,*a[5]是没意义的吧?编译器不知道是啥意思吧

你说在哪段代码里面?还是我随手写的那个a[5] ?
5#
发表于 2013-7-18 15:11:37 | 只看该作者
rosynirvana 发表于 2013-7-18 15:10
你说在哪段代码里面?还是我随手写的那个a[5] ?

我说他原来写的那个形参*a[5]
6#
发表于 2013-7-18 15:15:47 | 只看该作者
90°C 发表于 2013-7-18 15:11
我说他原来写的那个形参*a[5]

形参列表中的变量相当于声明过了
7#
发表于 2013-7-18 15:16:58 | 只看该作者
rosynirvana 发表于 2013-7-18 15:15
形参列表中的变量相当于声明过了

我就是想问这么声明的意义是什么  int *a[5]
8#
发表于 2013-7-18 15:18:43 | 只看该作者
rosynirvana 发表于 2013-7-18 15:15
形参列表中的变量相当于声明过了

编译器会把a[5]作为一个指向整形变量的空间,而不是五个,开辟空间??
9#
发表于 2013-7-18 15:28:33 | 只看该作者
90°C 发表于 2013-7-18 15:16
我就是想问这么声明的意义是什么  int *a[5]

类形是int **
分析是这么分析的,首先,下标运算符[]的优先度高于间接运算符*,所以首先是a[5],所以a是一个数组,然后数组中的元素经过间接运算*后,类型是int,所以数组中的元素是int *,指向int的指针:
a是一个数组,数组的长度为5
a中元素的类型是int *,指向int的指针
(简而言之,是一个指针数组)

然后,1维的数组经过参数传递,会被转化为指向首地址的指针,数组的长度在这一过程中丢失了,于是int (*)[5]退化成了int **
10#
发表于 2013-7-18 15:29:57 | 只看该作者
90°C 发表于 2013-7-18 15:18
编译器会把a[5]作为一个指向整形变量的空间,而不是五个,开辟空间??

如果你是说传参这个过程,编译器会把a的地址拷贝过去,空间就是一个指针的空间,4字节或者8字节
11#
发表于 2013-7-18 15:33:32 | 只看该作者
rosynirvana 发表于 2013-7-18 15:28
类形是int **
分析是这么分析的,首先,下标运算符[]的优先度高于间接运算符*,所以首先是a[5],所以a是 ...

学习下!看来我需要好好看基础。
12#
发表于 2013-7-19 20:38:28 | 只看该作者
{:soso_e147:}
13#
 楼主| 发表于 2013-8-5 16:12:48 | 只看该作者
rosynirvana 发表于 2013-7-17 11:29
因为你没搞清楚一些概念
int(*a)[5]和int*a[5]有什么区别要先想清楚
你要的代码应该是这样子的

麻烦解释下 int(*) 和int * 叫我不用数组的时候第二种成功 谢谢
14#
发表于 2013-8-5 17:02:45 | 只看该作者
ahwing 发表于 2013-8-5 16:12
麻烦解释下 int(*) 和int * 叫我不用数组的时候第二种成功 谢谢

int (*)和int *没区别
叫我不用数组的时候第二种成功

这句我没看懂
15#
 楼主| 发表于 2013-8-6 16:12:58 | 只看该作者
rosynirvana 发表于 2013-8-5 17:02
int (*)和int *没区别

这句我没看懂

我不用数组的时候int * 是可以传递参数的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表