#include
#include
#include
#define LEN 256
int main(void)
{
char **pt;
int i, n, length;
static char temp[LEN];
printf("How many words do you wish to enter? ");
scanf("%d", &n);
if ((pt = (char **)malloc(n * sizeof(char *))) != NULL)
{
printf("Enter %d words now:\n", n);
for (i = 0; i < n; i++)
{
scanf("%255s", temp);
length = strlen(temp) + 1;
pt[i] = (char *)malloc(length * sizeof(char));
//↑使用malloc分配足够的存储空间来存储单词;
if (NULL == pt[i])
{
printf("Memory allocation failed!\n");
exit(EXIT_FAILURE);
}
strcpy(pt[i], temp);
//↑从临时数组中把单词拷贝到动态分配的存储空间中;
}
printf("Here are your words:\n");
for (i = 0; i < n; i++)
{
puts(pt[i]);
free(pt[i]);
pt[i] = NULL;
}
free(pt);
pt = NULL;
//↑指针仍然指向malloc分配的存储空间;
//↑因此令指针指向NULL后防止内存滥用;
}
else
{
printf("Memory allocation failed!\n");
exit(EXIT_FAILURE);
}
return 0;
}
这条代码加static和不加static有什么区别啊?我感觉也没什么区别啊
参考这篇文章:https://wenku.baidu.com/view/b2182af2baf3f90f76c66137ee06eff9aef8496e.html
上面的代码里,确实没什么区别,除了加static后初始化。
static修饰局部变量使得该局部变量的空间分配在静态区,这样在函数调用结束时,该变量的空间不会释放,下次调用时,可以继续使用同一块空间。所以常用于子函数中,因为子函数才会多次调用。用在main函数中,在使用上无差别,因为main函数只会调用一次。
你如果讲的是这句的话 static char temp[LEN] :
那么加static和不加static也可以说是普通局部变量与static局部变量的区别:
内存分配和释放
1、普通局部变量只有执行到变量定义的语句的时候才分配空间。
2、static局部变量在编译阶段(函数还没有执行),变量的空间已经分配。
3、普通局部变量离开作用域{ },自动释放其空间,也就无法使用此变量。
4、static局部变量只有在整个程序结束的时候才将其自动释放。
初始化
1、普通局部变量不初始化,为随机值。
2、static局部变量不初始化,为0。
3、static局部变量初始化语句只有第一次执行时有效,但是可以赋值多次。
4、static局部变量只能用它常量初始化。