2011-02-08 28 views
14

Khi tôi chạy đoạn mã sau:hành vi strcmp

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    p = strcmp(NULL,"foo"); 

    return 0; 
} 

tôi nhận được lỗi phân khúc. echo $? 139. Nhưng khi tôi chạy

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    strcmp(NULL,"foo"); // Note removed assignment 

    return 0; 
} 

Tôi không nhận được bất kỳ lỗi phân đoạn nào. Ai đó có thể ném một ít ánh sáng được không?

Dưới đây là thông tin gcc của tôi:

> gcc --version 
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) 

Trả lời

30

Có thể bạn đang sử dụng tùy chọn tối ưu hóa khi biên dịch. Kể từ khi kết quả của strcmp() trong đoạn thứ hai được bỏ qua trình biên dịch loại bỏ cuộc gọi chức năng này và đây là lý do tại sao chương trình của bạn không sụp đổ. Cuộc gọi này có thể được loại bỏ chỉ vì strcmp() là một chức năng nội tại, trình biên dịch nhận thức được rằng chức năng này không có bất kỳ tác dụng phụ nào.

+0

Vâng, tôi đã không làm bất kỳ cài đặt trình biên dịch để bật tối ưu hóa, tuy nhiên nó sẽ tự động. Bạn đã được phát hiện. –

+2

gcc thực hiện SSA hoạt động ngay cả khi không bật tối ưu hóa. SSA có thể xóa mã chết. http://en.wikipedia.org/wiki/Static_single_assignment_form –

3

Những gì bạn đang làm là không xác định. strcmp yêu cầu các con trỏ hợp lệ đối với các chuỗi bị vô hiệu.

NULL không phải là con trỏ đến chuỗi bị chấm dứt null.

6

Bạn cần phải:

  • Bao gồm các tiêu đề thích hợp, hoặc tuyên bố chức năng bằng tay. Đối với strcmp(), bạn cần <string.h>.
  • Không vượt qua một con trỏ không hợp lệ như NULL đến strcmp(), vì nó không bảo vệ chống lại nó và sẽ dereference con trỏ, do đó gây ra hành vi không xác định trong chương trình của bạn.
+6

OP biết rằng NULL không hợp lệ, nhưng hỏi tại sao hai trường hợp lại khác nhau. –