2013-10-28 15 views
60

Tôi cố gắng để viết một chương trình C trong linux rằng có sqrt của đối số, Dưới đây là các mã:Lỗi phân đoạn (lõi được bán phá giá) là gì?

#include<stdlib.h> 
#include<stdio.h> 
#include<math.h> 

int main(char *argv[]){ 
    float k; 
    printf("this is consumer\n"); 
    k=(float)sqrt(atoi(argv[1])); 
    printf("%s\n",k); 
    return 0; 
} 

Sau khi tôi gõ vào đầu vào của tôi tại "shell>" nhanh chóng, gcc mang lại cho tôi những lỗi sau :

Segmentation fault (core dumped) 
+0

http://en.wikipedia.org/wiki/Core_dump –

+4

chuỗi định dạng sai được sử dụng bạn cần '% f', không phải'% s' –

+1

Thử 'int main (int argc, char * argv [])'. – Beta

Trả lời

86

"Lỗi phân đoạn" có nghĩa là bạn đã cố gắng truy cập vào bộ nhớ mà bạn không có quyền truy cập.

Vấn đề đầu tiên là đối số của bạn là main. Hàm main phải là int main(int argc, char *argv[]) và bạn nên kiểm tra xem argc có phải là ít nhất 2 trước khi truy cập argv[1] hay không.

Ngoài ra, kể từ khi bạn đang đi trong một float để printf (trong đó, bằng cách này, được chuyển đổi sang một double khi đi qua để printf), bạn nên sử dụng sự xác định định dạng %f. Trình định dạng định dạng %s dành cho các chuỗi ('\0' mảng ký tự được tối ưu hóa).

+1

cảm ơn bạn rất nhiều: - * :) – user2929110

+0

Tôi đã được dạy rằng nó phải là 'int main (int argc, char ** argv)' thay vì 'int main (int argc, char * argv [])'. Mặc dù cách bạn đặt nó là chính xác, 'char \ * \ *' là cách thực sự 'đúng' để thực hiện nó bởi vì nó đại diện cho một con trỏ trỏ tới một ký tự. –

+2

@WillHopkins Tiêu chuẩn nói rằng 'int main (void)' và 'int main (int argc, char * argv [])' hoặc tương đương được chấp nhận, với chú thích sau "tương đương" nói "Như vậy,' int' có thể được thay thế bằng tên typedef được định nghĩa là 'int', hoặc kiểu' argv' có thể được viết là 'char ** argv', v.v." Vì vậy, thực sự, đó là vấn đề về phong cách. (xem 5.1.2.2.1 Khởi động chương trình) –

Các vấn đề liên quan