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)语句不起作用。