2012-01-03 3 views
30

은 내가 그리워 무슨 오류버스 오류 : 나는 응용 프로그램을 실행할 때 10 오류가 여기에

Bus error: 10 

을 얻을 내 코드

#import <stdio.h> 
#import <string.h> 

int main(int argc, const char *argv[]) 
{ 
    char *str = "First string"; 
    char *str2 = "Second string"; 

    strcpy(str, str2); 
    return 0; 
} 

그것은 경고 나 오류없이 잘 컴파일되지만?

+1

음,'나 strlen (캐릭터를) 메모리를 asign 필요

<나 strlen를 사용 할 때마다 (str2)'. –

+29

누구나'# import'가 누락 되었습니까? !! –

+4

@SangeethSaravanaraj 네, 믿을 수 없습니다. LOL 모두들 그걸 놓쳤다 ... – Mysticial

답변

34

하나의 경우 문자열 리터럴을 수정할 수 없습니다. 정의되지 않은 동작입니다.

당신이 str에게 로컬 배열 할 수 있음을 해결하려면 : 두 번째 문제가있는 것, 지금

char str[] = "First string"; 

strstr2을 보관 유지하는데 충분한 크기가 아닌 것입니다. 따라서 길이를 늘려야합니다. 그렇지 않으면 str을 오버런합니다. 이는 정의되지 않은 동작이기도합니다.

이 두 번째 문제를 해결하려면 str2만큼 길게 str을 만들어야합니다.

char *str2 = "Second string"; 
char *str = malloc(strlen(str2) + 1); // Allocate memory 
// Maybe check for NULL. 

strcpy(str, str2); 

// Always remember to free it. 
free(str); 

는 (C99)에 블라스를 포함하는이 작업을 수행하고 할당을 쌓아 다른 더 우아한 방법이있다, 그러나 그들의 사용은 다소 의문이다 나는 그로 이동하지 않습니다 또는 동적으로 할당합니다. @SangeethSaravanaraj이 코멘트에 지적


은, 모두가 #import를 놓쳤다. #include이어야합니다.

#include <stdio.h> 
#include <string.h> 
+15

신비한,'# import'는 clang과 GCC 모두를 위해 C 언어에서 지원되며 objective-c 확장이다. OP 코드에는 아무런 문제가 없습니다. 자동 포함 경비원 만 추가하기 때문에 아무 문제가 없습니다. –

5

str2은 정적으로 할당 된 상수 문자 배열을 가리 킵니다. 당신은 그것에/쓸 수 없습니다. *alloc 패밀리를 통해 공간을 동적으로 할당해야합니다.

3

문자열 리터럴은 C에서 수정할 수 없습니다

4

문자열 리터럴을 덮어 쓰려고 시도합니다. 이것은 정의되지 않은 동작입니다.

이 해결 방법에는 여러 가지가 있습니다 : 다음 strcpy() 다음 free()

  1. 사용 malloc()을;
  2. str을 배열로 바꾸고 strcpy();
  3. strdup()을 사용하십시오.
7

문자열에 할당 된 공간이 없습니다.그

#import <stdio.h> 
#import <string.h> 

해야 이외의 malloc()free()

와 배열 (또는) 포인터를 사용

#include <stdio.h> 
#include <string.h> 

참고 :

  • 아무것도 malloc() 에디션은 'free()이어야합니다 ed
  • ,363,210
  • 당신이 길이 n이다 문자열을 n + 1 바이트를 할당해야

당신은 STR은 참조로 다음 코드는

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

int main(int argc, char *argv[]) 
{ 
    //char *str1 = "First string"; 
    char *str1 = "First string is a big string"; 
    char *str2 = NULL; 

    if ((str2 = (char *) malloc(sizeof(char) * strlen(str1) + 1)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    strcpy(str2, str1); 

    printf("str1 : %s \n", str1); 
    printf("str2 : %s \n", str2); 

    free(str2); 
    return 0; 
} 
+1

+1은'# import'에 주목하는 유일한 사람입니다. – Mysticial

4

이되어주십시오 있기 때문에 (마지막 바이트는 \0입니다) 문자열 리터럴을 가리키는 것은 상수 문자열을 의미하지만 복사하여 수정하려고합니다. 참고 : 그것은 그것으로 인해이 오류 나누었다 런타임에서 세그먼트 오류를받은 것 메모리 할당에 오류했을 경우 상수 문자열 수정으로 인해오고있다 또는 당신은 버스 오류 ABT 자세한 내용은 아래를 통과 할 수 있습니다 : 의 정렬 요건을 만족하지 않는 어드레스와 프로세서 명령을 이용

Bus errors are rare nowadays on x86 and occur when your processor cannot even attempt the memory access requested, typically:

  • . 해제 된 무언가에 대한 포인터를 사용하여

Segmentation faults occur when accessing memory which does not belong to your process, they are very common and are typically the result of:

  • .
  • 따라서 초기화되지 않은 위조 포인터를 사용합니다.
  • null 포인터를 사용 중입니다.
  • 버퍼 오버플로.

더 정확하게는 문제를 일으킬 포인터 자체를 조작하지 않고 포인터가 가리키는 (참조 해제하는) 메모리에 액세스하는 것입니다.

1

는 포인터 변수를합니다 (별표)와 같은

char *str = "First string"; 당신이 그것에

str = malloc(strlen(*str))

관련 문제