作者tokyobabylon (paris)
看板C_and_CPP
標題[問題] 字串指標問題...
時間Thu Dec 31 18:22:14 2009
剛寫了這隻小程式
發現字串指標的一些問題還是搞不太懂...
#include <stdio.h>
#include <stdlib.h> // 用system("pause")要include stdlib.h這個header
#include <assert.h> // 用assert()時要宣告assert.h
#include<iostream.h>
#include<cstdlib>
#define EXAM_ASSERT(x) assert(x) //定義function-like macro EXAM_ASSERT
// assert() 若其argument為0 則會中斷程式
/*
用ASSERT保證沒有定義的特性或功能不被使用。
*/
void exam_fun(char* test_str) //這個exam_fun檢查傳進來的char pointer若內容是
NULL 就中斷程式
{
EXAM_ASSERT(test_str!= NULL);
}
int main(void)
{
char *str=NULL;
//str=(char *)malloc(sizeof(char));
//str=NULL;
//cout <<"str "<< str <<endl; //尚未指定char* str的內容之前就要看他的內容
,當!
printf("&str=%p\n",&str); //pointer 已存在故可以看到他的位址
//cout <<"*str "<< *str <<endl; //一樣,char* str內容尚未指定前就要看他的內
容,當!
str="b";
exam_fun(str);
printf("str已經被指定一個值b\n");
printf("str=%p\n",str);
printf("&str=%p\n",&str);
printf("*str=%s\n",str);
cout<<*str<<endl;
system("pause");
return 0;
}
問題1.
再最後一個printf中,為什麼要用printf("*str=%s\n",str)才可以過?
原本我是寫printf("*str=%s\n",*str)卻interrupt跳掉
我原本就是要str內含的值阿~~~~
但是在更下面的cout<<*str ;
使用cout時卻可以過 而不是使用cout<<str ;
問題2.
我使用dev-c compile
雖然可以跑卻是有warning...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.9.4.125
推 VictorTom:str是char*, 所以*str或str[0]是一個char, 你用%s印它預 12/31 18:27
→ VictorTom:期你要給它一個字串的起點位址, 而你那樣寫相當於把一個 12/31 18:28
→ VictorTom:char的值給下去當字串的起點位址, 基本上crash是正常的. 12/31 18:28
→ VictorTom:要印單一的char字元出來, 應該改用 %c 而不是 %s :) 12/31 18:29
→ tokyobabylon:但是我在上方所設的是str="b",而非是設成str='b',我 12/31 18:36
→ tokyobabylon:是要印字串沒錯呀@@ 12/31 18:37
推 RiverJackson:sizeof issue 12/31 21:51
推 VictorTom:你想印什麼是一回事, 它實際上是什麼是一回事:) 12/31 22:06
推 VictorTom:如果你寫的程式實際上沒有照著它應有的寫法, 程式只會照 12/31 22:09
→ VictorTom:它被寫成的結果來運作, 至於理由, 與如何寫才能照你希望 12/31 22:09
→ VictorTom:的運作, 就再琢磨一下吧XD 12/31 22:09
推 ilovebbs:要把str = "b" 當做 str = {'b', '\0'} 你就知道了 01/01 12:50