【基本题】以下代码能否正确运行,如果不能,出错原因是什么,如何改正。
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