本文目录一览:
- 1、c语言数组声明问题
- 2、C语言中,下列数组声明语句中,正确的是( )。
- 3、关于C语言变量和数组的声明问题
- 4、关于C语言申明数组的题,求详解
- 5、C语言声明数组参数的问题
- 6、关于c语言数组方面的题
c语言数组声明问题
一般有四种数组定义方式,以一维数组为例:
//定义指定维数的数组
int arr[10];
//定义不指定维数的数组,数组维数有初化列表元素个数决定。
int arr[] = {1,2,4};
//定义指定维数的数组,初始化不完全时,系统将未初始化元素初始化为0
int arr[10] = {1,2};
//动态分配一个数组。下面分配了一个有10个元素的数组。
int *arr =(int *) malloc(10 * sizeof(int));
C语言中,下列数组声明语句中,正确的是( )。
A
A选项中,inta[]={1,2,3,5};,由于没有指定数组长度,数组长度即为赋值列表的元素个数,因此正确;B选项中,赋值元素个数大于数组长度;C选项中,应该用单引号将每个字母括起来;D选项中,系统会添加一个\0作为字符串结束符,数组长度应为5。
关于C语言变量和数组的声明问题
首先声明变量了是有内存分配的。
如果定义数组后可以得到连续的内存分配(有时候特别占用空间)。所以C语言出了链表(可以不连续的村一组数据)。
下面是C语言内存分配特性,可以参考。
1、C中内存分为四个区
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。
程序代码区:用来存放程序的二进制代码。
例子(一)
int a = 0; //全局区
void main()
{
int b; //栈
char s[] = abc; //s在栈,abc在文字常量区
char *p1,*p2; //栈
char *p3 = 123456; //123456在常量区,p3在栈上
static int c =0; //全局区
p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆
p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆
strcpy(p1, 123456); //123456放在常量区
}
例子(二)
//返回char型指针
char *f()
{
//s数组存放于栈上
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据
}
2、动态分配释放内存
用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。
内存分配成功后要对内存单元进行初始化。
内存分配成功且初始化后使用时别越界了。
内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。
NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
请问运行Test函数后会是什么样的结果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
问题同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str,100);
strcpy(str,hello);
printf(str);
}
问题同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)
{
strcpy(str,world);
printf(str);
}
}
问题同NO.1
我对以上问题的分析:
NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串helloworld拷贝到str指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在!(建议:画图理解)
NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"helloworld"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.
NO.3:正确答案为可以打印出hello.但内存泄漏了!
NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误.
关于C语言申明数组的题,求详解
B错,因为未指定数组的大小且str="China"; 不能这样为数组赋值。
C错,因为str1=str2;不能这样为数组赋值。
D错,因为未指定数组的大小。
答案A。
C语言声明数组参数的问题
看下面代码:
int main()
{
int a[5]={3,6,4,2,5};
char *ptrChar="hello world";//ptrChar是char类型的指针,指向内存空间
int *ptrInt=a;//ptrInt是指向int类型的指针
printf("sizeof(char):%d\n",sizeof(char));
printf("sizeof(int):%d\n",sizeof(int));
printf("sizeof(ptrChar):%d\n",sizeof(ptrChar));
printf("sizeof(ptrInt):%d\n",sizeof(ptrInt));
printf("value of ptrChar is:%d\n",ptrChar);
printf("value of (ptrChar+1) is:%d\n",ptrChar+1);
printf("value of ptrInt is:%d\n",ptrInt);
printf("value of (ptrInt+1) is:%d\n",ptrInt+1);
system("pause");
return 1;
}
程序运行结果如下:
从程序的运行结果可以得出:
指针本身是一个变量,它所存储的是另一个变量的地址,指针变量所占的内存是4个字节,这与它所指向的变量所占的内存空间大小是没有关系的,指针变量本身和它所指向的内存空间是完全独立的
关于c语言数组方面的题
这个题主要是从后往前依次用数组中的元素与新输入的数字进行比较:
如果小的话,数组元素往后移;如果大的话,停住,放入这个元素。
具体程序如下:
#includestdio.h
int main()
{
int a[11] = { 3, 5, 7, 10, 17, 19, 22, 38, 51, 92 };
int num;
scanf("%d", num);
int i = 9;
while (i = 0 num a[i])
{
a[i + 1] = a[i];
i--;
}
a[i + 1] = num;
for (int i = 0; i 11; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
结果为: