1、数组名和指针
#include<stdio.h> void fun(char str[100]) { printf("%d\n", sizeof(str)); //4,当数组作为函数的形参时,退化为指针 } int main(void) { char str[] = "Hello"; char *p = str; printf("%d\n", sizeof(str)); //6,别忘了最后的'\0' printf("%d\n", sizeof(p)); //4 fun(str); return 0; }
2、有关内存的思考
#include<stdio.h> #include<stdlib.h> #include<string.h> void GetMemory(char *p) { p = (char *)malloc(100); } int main(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); return 0; } main函数中的 str一直都是 NULL。 strcpy(str, "hello world");将使程序崩溃。
#include<stdio.h> #include<stdlib.h> #include<string.h> char * GetMemory() { char p[] = "hello world"; return p; } int main(void) { char *str = NULL; str = GetMemory(); printf(str); return 0; } 输出乱码。GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
#include<stdio.h> #include<stdlib.h> #include<string.h> void GetMemory(char **p, int num) { *p = (char *)malloc(num); } int main(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); return 0; } (1)能够输出hello (2)内存泄漏
#include<stdio.h> #include<stdlib.h> #include<string.h> void GetMemory(char **p, int num) { *p = (char *)malloc(num); } int main(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); free(str); //释放在GetMemory内申请的内存 free(str); //程序崩溃 return 0; }
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char *str = (char *) malloc(100); strcpy(str, "hello"); free(str); if(str != NULL) { strcpy(str, "world"); printf(str); } return 0; } 篡改堆区的内容,后果难以预料,非常危险。 因为free(str);之后,str成为野指针, if(str != NULL)语句不起作用。