加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 小而奇怪

发布时间:2020-12-16 09:48:10 所属栏目:百科 来源:网络整理
导读:我对C内存概念不是很熟悉.我试图寻找解决方案,但找不到一个. 我只是想在C中创建动态数组.我试图以这种方式创建它,同时试图检查地址是否连续.程序运行正常. 但是,在语句系统(“暂停”)之后我遇到了分段错误.我也尝试使用调试器进行调试,没有运气!我正在使用D
我对C内存概念不是很熟悉.我试图寻找解决方案,但找不到一个.

我只是想在C中创建动态数组.我试图以这种方式创建它,同时试图检查地址是否连续.程序运行正常.

但是,在语句系统(“暂停”)之后我遇到了分段错误.我也尝试使用调试器进行调试,没有运气!我正在使用Dev CPP.

任何人都可以指导我吗?

#include<stdio.h>
#include<stdlib.h>

main()
{
 int a[0],*ptr,i;

 printf("%d",sizeof(a[0]));
 a[0]=1;
 for(i=1;i<10;i++)
 {
  ptr=(int *) malloc(sizeof(int));
  printf("Enter a[%d]:  ",i);
  a[i]= *ptr;
  scanf("%d",&a[i]);

 }
 i=0;
 while(i<10)
 {printf("n%u",&a[i++]);}
 free(ptr);
 system("pause");
}

解决方法

int a [0]

没有分配任何空间(其宽度为0)

然而你在这一行写到:

一个[0] = 1;

你还假设它有10个元素:

while(i<10)
{printf("n%u",&a[i++]);}
free(ptr);

实际上,因为这只是堆栈内存,所以你只需要写入堆栈的另一部分.例如,你可以覆盖ptr的值.通常这可能会被检测到,直到堆栈被解开并且其中一部分明显被破坏.在主系统返回时,堆栈在系统(“暂停”)之后立即展开.

(另外,如果ptr被你的写入覆盖,你不能确定free是否合理.)

要分配10个整数数组,请使用以下语法:

int a[10];

然后你可以使用[0]到[9].但是当你尝试读/写[10]时,这是C不要指望任何保护你的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读