【C】字符串常量和字符數組
阿新 • • 發佈:2017-06-05
gcc pre class fun 後者 一段 put light cmp
此次博客是轉載某位博主的文章,不過現在找不到了,所以先聲明一下。
先貼一段代碼:
#include <stdio.h> int main(int argc, const char** argv) { char str_1[6] = "Crazy1"; char* str_2 = "Crazy2"; if (str_1 == "Crazy1") { printf("%s\n", "字符數組OK"); } if (str_2 == "Crazy2") { printf("%s\n", "字符串常量OK"); } return 0; }
結果: 字符串常量OK
區別分析:
字符數組和字符串常量的區別,本質區別:前者在棧上分配空間,後者存儲在靜態存儲區等。
這裏 str_2是指針, 指向”Crazy2″這個字符串常量的內存首地址, 而str_1是在棧裏分配的字符數組”Crazy1″的首地址.
字符串常量是在編譯時就確定的, 而字符數組是在運行時確定的.
字符數組為什麽不行呢? 很顯然 因為他們不屬於同一個內存空間.
建議: C字符串比較都使用strcmp
C++ string類就可以直接使用==操作。
反匯編:
.section .rodata .LC0: .string "Crazy2" .LC1: .string "OK" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp movl $2053206595, 22(%esp) movw $12665, 26(%esp) movl $.LC0, 28(%esp) cmpl $.LC0, 28(%esp) jne .L2 movl $.LC1, (%esp) call puts .L2: movl $0, %eax leave ret .size main, .-main .ident "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)" .section .note.GNU-stack,"",@progbits
【C】字符串常量和字符數組