C基本题_内存

【基本题】以下代码能否正确运行,如果不能,出错原因是什么,如何改正。
 char *p = "hello";
 p[0] = 'H';
 printf("%s", p);
这样是出错的 字符串常量“hello”出现在一个表达式中时,表达式使用的值就是这些字符所存储的地址,而不是字符本身,所以把字符串赋值给指向字符的指针是可以的。
但是 p[0] = 'H'不行 ?? 详细原因神马的,我也不是很清楚 希望可以大家一起讨论!!
改正: char a[6] = "hello";
 char *p = a;
 p[0] = 'H';
 printf("%s",p);  //这样是可以的
---------------------------------------
 char *p = "hello";
 *p = "Hello";
 printf("%s",p); //这样也是可以的
有错误的地方或者还有更多更好的解答请大家一起讨论。。。

【基本题】以下代码能否正确运行,如果不能,出错原因是什么,如何改正。
 int _tmain(int argc, _TCHAR* argv[])
 {
     char a[10000000] = {0};
     return 0;
 }
Windows系统默认用户栈大小为4M(约4000000)。现在用了10000000字节当然会溢出。
为什么编译器没报警告呢?
原因:编译器编译时并不做检查。
可以尝试将堆栈设置更大,要么将其放到函数外,也就是作为全局(或静态)变量存在,那就不受限了(不过最多也就是4G),故编译可以通过。
附:更改堆栈大小的方法(以Visual Studio开发环境为例)
详细内容可以去看下http://blog.csdn.net/qiance/article/details/4091953
1. 点击菜单栏的“项目”,打开此项目的“属性”对话框,单击“配置属性”中的“链接器”文件夹
2. 单击“系统”属性
3. 修改下列任一属性:
        * 堆栈提交大小  指定物理内存中堆栈分配的合计大小

        * 堆栈保留大小  指定虚拟内存中对照分配的合计大小

【选做题】实现一个“可变长二维数组”,这个二维数组的行数可由输入决定,每行的元素个数仍可由输入决定。每个数组元素值都是1.
执行结果如下:

请输入行数:
5
请输入第1行的元素个数:
20
请输入第2行的元素个数:
34
请输入第3行的元素个数:
17
请输入第4行的元素个数:
9
请输入第5行的元素个数:
25
11111111111111111111
1111111111111111111111111111111111
11111111111111111
111111111
1111111111111111111111111

#include"stdio.h"
#include"stdlib.h"
void main()
{
 int rows;
 int **row;
 int *q,*p;
 int i,j;
 printf("请输入行数:\n");
 scanf("%d",&rows);
 row=(int **)malloc(sizeof(int)*rows);
 if( NULL == row)
     {
  printf("Insufficient memory available!\n" );
  return;
 }
 p=(int *)malloc(sizeof(int)*rows);
 if( NULL == p)
     {
  printf("Insufficient memory available!\n" );
  free(row);
  row=NULL;
  return;
 }
 for(i=0;i<rows;i++)
 {
  printf("请输入第%d行的元素个数:\n",i+1);
  scanf("%d",&p[i]);
  row[i]=(int *)malloc(sizeof(int)*p[i]);
  if( NULL ==row[i])
  {
   printf("Insufficient memory available!\n" );
   free(p);
   p=NULL;
   return;
  }
  q=row[i];
  for(j=0;j<p[i];j++)
   q[j]=1;
 }
 for(i=0;i<rows;i++)
 {
  q=row[i];
  for(j=0;j<p[i];j++)
  {
   printf("%d",q[j]);
  }
  printf("\n");
 }
 free(p);
 p=NULL;
 for(i=0;i<rows;i++)
 {
  free(row[i]);
  row[i]=NULL;
 }
 free(row);
 row=NULL;
}
Press any key to continue

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值