-2

을 가진 내가 매트릭스의 안장 위치를 ​​찾기 위해이 프로그램을하고 있어요 그래서C - 분할 고장 동적 할당

(요소는 자신의 칼럼과 동시에 자신의 행에서 가장 작은에서 가장 큰 수있다) 여기에 문제가 있습니다. 세그먼트 오류가 발생했습니다. 창을 사용할 때 실제로는 잘 작동하지만 Ubunto에서 실행하면 작동하지 않습니다. 불행히도, 내 컴퓨터에는 창문 만 있기 때문에 왜 작동하지 않는지, 어디서 잘못 될지 알 수는 없습니다.

내가 도와 줄 수 있겠 니? 코드에 어떤 문제가 있는지 또는 오류가있는 곳을 알려주십시오.

int main(){ 
    int i, j, *ml, *mc, key = 1, z; 
    int ordem, **me; 
    char car; 

    /* ml = smallest of each row, mc = greatest of each column 
    * me = given matrix 
    * ordem = size of matrix */ 

    scanf("%d", &ordem); 

    me = malloc(ordem * sizeof(int)); 
    for(i = 0; i < ordem; i++){ 
     me[i] = malloc(ordem * sizeof(int)); 
    } 
    ml = malloc (ordem * sizeof(int)); 
    mc = malloc (ordem * sizeof(int)); 

    for(i = 0; i < ordem; i++){ 
     scanf("%d", &me[i][0]); 
     for(j = 1; j < ordem; j++){ 
      scanf(" %d", &me[i][j]); 
     } 
     do{ 
      z = scanf("%c", &car); 
     }while ((z != EOF) && (car != '\n')); 
    } 

필요한 경우

, 나는 사람들에게 당신에게 코드의 나머지 부분을 제공 할 수 있습니다,하지만 난 오류가 malloc에 ​​나 scanf와에 하나, 거기에 무슨 일이 일어나고 있음을 확신 해요.

정말 감사드립니다. 친애하는!

+0

'우분투'가 없습니다. –

+1

안녕하세요. SO에 오신 것을 환영합니다! 귀하의 질문은 불충분 한 정보로 인해 마감 될 것입니다. 디버거를 사용하여 문제를 특정 코드 행으로 좁혀주십시오. –

+3

첫 번째 할당은'malloc (ordem * sizeof (int *))'이어야합니다. – Barmar

답변

1
int **me; 
me = malloc(ordem * sizeof(int)); 

여기가 실수입니다! 그것은이다 :

me = malloc(ordem * sizeof(int*)); 

당신의 malloc, 여기에서 segfault의 콤의 90 % ...

0

포인터 배열을 할당 할 때 int가 아닌 포인터의 요소 크기를 가져야합니다. 우분투 시스템에서는 포인터 크기가 64 비트이고 int는 32이지만 Windows에서는 전통적으로 같은 크기입니다.

+0

@Adarsh ​​: 세계는 x86에서 끝나지 않습니다. –

+0

@DanielKamilKozar 잠재적으로 잘못되었을 수도 있습니다. 그의 우분투는 x86의 64 비트 파생물에서 실행됩니다. –

+0

미안 @Peter는 나중에 자신의 게시물을 업데이트했습니다. 미안합니다. – Adarsh

1

문제가

me = malloc(ordem * sizeof(int)); 

meint**입니다 라인에 아마를 확인 항상 두 번, 그래서 이 아니라 int*에 할당해야합니다.

다른 컴파일러가 반드시 해당 데이터 유형에 대해 동일한 크기를 사용하지 않으므로 이식성 문제가 발생합니다. 다른 컴퓨터에서이 코드를 실행하여 현재 진행중인 작업을 테스트 해보십시오. 이 오류가 만들 어렵 있도록 코딩 스타일을 수정할 수 있습니다

printf("The size of an int is %d\n", sizeof(int)); 
printf("The size of an int* is %d\n", sizeof(int*)); 

방법이 너무

me = malloc(ordem * sizeof(*me)); 

처럼 sizeof 연산자에 당신이 있음을 시각적으로 볼 수있는이 방법을 변수 이름을 사용하는 것입니다 me이 가리키는 유형의 변수 ordem에 대한 공간을 할당하고 있습니다.