2
、評價下面的**片斷:
unsigned int zero = 0;
unsigned int compzero = 0xffff;
對於乙個
int型不是
16位的處理器為說,上面的**是不正確的。應編寫如下:
unsigned int compzero = ~0;
這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗裡,好的嵌入式程式設計師非常準確地明白硬體的細節和它的侷限,然而
pc機程式往往把硬體作為乙個無法避免的煩惱。
int main()
8
、請問下面程式有什麼錯誤
?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
答案:把迴圈語句內外換一下
11
、寫出下面的結果
char str1 = "abc";
char str2 = "abc";
const char str3 = "abc";
const char str4 = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
結果是:
0 0 1 1
解答:str1,str2,str3,str4
是陣列變數,它們有各自的記憶體空間; 而
str5,str6,str7,str8
是指標,它們指向相同的常量區域。
12
、以下**中的兩個
sizeof
用法有問題嗎?
void uppercase( char str ) //
將str
中的小寫字母轉換成大寫字母
char str = "abcde";
cout << "str
字元長度為
: " << sizeof(str)/sizeof(str[0]) << endl;
uppercase( str );
cout << str << endl;
答:函式內的
sizeof
有問題。根據語法,
sizeof
如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。函式外的
str是乙個靜態定義的陣列,因此其大小為
6,函式內的
str實際只是乙個指向字串的指標,沒有任何額外的與陣列相關的資訊,因此
sizeof
作用於上只將其當指標看,乙個指標為
4個位元組,因此返回4。
main() ;
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); }
輸出:2,5
*(a+1
)就是a[1]
,*(ptr-1)
就是a[4],
執行結果是2,
5 &a+1
不是首位址
+1,系統會認為加乙個
a陣列的偏移,是偏移了乙個陣列的大小(本例是5個
int)
int *ptr=(int *)(&a+1); 則
ptr實際是
&(a[5]),
也就是a+5
原因如下: &a
是陣列指標,其型別為
int (*)[5];
而指標加
1要根據指標型別加上一定的值,
不同型別的指標
+1之後增加的大小不同 a
是長度為5的
int陣列指標,所以要加
5*sizeof(int) 所以
ptr實際是
a[5] 但是
prt與
(&a+1)
型別是不一樣的
(這點很重要)
所以prt-1
只會減去
sizeof(int*)
a,&a
的位址是一樣的,但意思不一樣,
a是陣列首位址,也就是
a[0]
的位址,
&a是物件(陣列)首位址,
a+1a[1],&a+1
a[5].
函式前加
static
修飾表明
該函式只能在
所在的原始檔裡呼叫
21
、對絕對位址
0x100000
賦值且想讓程式跳轉到絕對位址是
0x100000
去執行
(unsigned int*)0x100000 = 1234;
首先要將
0x100000
強制轉換成函式指標,即
: (void (*)())0x100000
然後再呼叫它:
*((void (*)())0x100000)(); 用
typedef
可以看得更直觀些:
typedef void(*)() voidfuncptr;
*((voidfuncptr)0x100000)();
指向函式的指標??
void getmemory(char **p,int num)
int main()
printf("\n str is %s",str);
getchar(); }
問輸出結果是什麼?希望大家能說說原因,先謝謝了 輸出
str is world。
free
只是釋放
str指向的記憶體空間
,它本身的值還是存在的
.
所以free
之後,有乙個好的習慣就是將
str=null. 此時
str指向空間的記憶體已被**
,如果輸出語句之前還存在分配空間的操作的話
,這段儲存空間是可能被重新分配給其他變數的,
儘管這段程式確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會列印出
world來。
這是因為,程序中的記憶體管理一般不是由作業系統完成的,而是由庫函式自己完成的。 當你
malloc
一塊記憶體的時候,管理庫向作業系統申請一塊空間(可能會比你申請的大一些),然後在這塊空間中記錄一些管理資訊(一般是在你申請的記憶體前面一點),並將可用記憶體的位址返回。但是釋放記憶體的時候,管理庫通常都不會將記憶體還給作業系統,因此你是可以繼續訪問這塊位址的,只不過。。。。。。。。樓上都說過了,最好別這麼幹。
sizeof(int)is 4
sizeof(long)is4
sizeof(char)is 4
sizeof(short)is 2
sizeof(double)is 8
sizeof(float)is 4
sizeof (long int )is 4
C語言面試
首先先看這篇部落格,不是我自己的但是能有不少幫助,這裡部分算抄襲這位大牛的部落格 正確答案 define min a,b a b a b 錯誤答案 define min a,b a b a b 或者 define min a,b a b a b 迴圈演算法 link node reverse lin...
面試基礎語言c
1.c 與c的區別 2.如何讓乙個c 程式執行c的程式且不需要對函式進行名字重整extern c 3.指標與引用的區別 4.c 中間的指標傳遞和引用傳遞 5.形參與實參 6.三種傳遞 7.static 8.靜態變數的初始化 9.const 10.指標與const 11.mutable 12.exte...
C語言面試題
基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...