c語言之建立字符串的兩種方式

在c語言中,通常有兩種方式來建立字符串ios

//第一種,利用字符指針
char* p = "hello"; //第二種:利用字符數組
char str[] = "hello";

那麼,它們之間有什麼區別呢?以例子說明:數組

#include<stdio.h> #include<iostream>
char* returnStr() { char* p = "hello world!"; return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }

輸出:函數

 

以上代碼是沒有問題的,"hello world"是一個字符串常量,存儲在常量區,p指針指向該常量的首字符的地址,當returnStr函數退出時,常量區中仍然存在該常量,所以仍然能夠用指針訪問到。spa

#include<stdio.h> #include<iostream>
char* returnStr() { char p[] = "hello world!"; return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }

輸出:指針

 

以上代碼有問題,輸出爲亂碼。這一段代碼和以前的最主要的區別就是returnStr中字符串的定義不一樣。這裏使用字符數組定義字符串。所以這裏的字符串並非一個字符串常量,該字符串爲局部變量,存查在棧中,當returnStr函數退出時,該字符串就被釋放了,所以再利用指針進行訪問時就會訪問不到,輸出一堆亂碼。code

固然 ,若是將char p[] = "hello world!";聲明爲全局變量,即:blog

#include<stdio.h> #include<iostream>
char p[] = "hello world!"; char* returnStr() { return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }

那麼,該字符串就會存儲在全局變量區,通常將全局變量區和靜態資源區和常量區視爲一個內存空間。所以,一樣能夠使用指針訪問到。內存

輸出:資源

相關文章
相關標籤/搜索