문제

다음 코드에 문제가 있습니다.

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

잘 컴파일하지만 실행하면 악명 높은 "0xc0000005 액세스 위반"오류가 제공됩니다. 나는 b를 null, "", "0", 0 및 기타 여러 가지로 설정하려고 시도했지만 "0xc0000005 액세스 위반"오류 또는 "표현 : string! = null. 어떤 도움이 도움이 될 것입니다!

도움이 되었습니까?

해결책

sprintf 기존 버퍼에 데이터를 작성하여 첫 번째 매개 변수로 전달합니다. 현재 당신은 b에 대한 값을 전혀 지정하지 않습니다. 즉, (c의 iirc) 값은 무엇이든 할 수 있습니다. NULL 또는 0으로 설정하면 sprintf 주소 0에서 시작하여 메모리에 쓰려고 노력할 것입니다.

sprintf가 그것을 쓸 수 있도록 적절한 크기의 버퍼를 만들어야합니다. 예를 들어:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

그게 든 실제로 버퍼를 할당하는 방법은 물론 실제 코드가 결과와 관련하여 원하는 것에 달려 있습니다.

다른 팁

음 ... B에 대한 포인터에는 쓰레기가 포함되어 있거나 공간을 할당하지 않았기 때문에 쓰레기가 포함되어 있습니다. SpringTF는 대상 버퍼 공간을 할당해야합니다 ...

최소한, 당신은 Char B [50] 또는 당신이 기대하는 최대 크기와 같은 것을 원합니다.

char*는 숯 또는 숯 배열에 대한 초기화 된 포인터입니다. 버퍼 숯 [10]을 정의해야합니다. 그렇지 않으면 Sprintf의 대상 주소가 정의되지 않았습니다.

Sprintf는 가능한 결과를 저장하기에 충분히 큰 이미 할당 된 문자 버퍼를 전달해야합니다. 이것은 버퍼 오버 플로우의 적용을받습니다. 대신 더 안전한 snprintf를 사용하고 싶을 것입니다. 비효율적이지만 안전한 방법 :

int bufsize = snprintf(NULL, 0, formatstring, ...);
char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
if (buffer == NULL) out_of_memory_error();
snprintf(buffer, bufsize+1, formatstring, ...);

매우 감사합니다! char*가 필요했기 때문에 코드를 다시 작성했습니다.

for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}

그리고 그것은 매력처럼 작동합니다. 나는 이제 마침내 내 인생을 계속할 수있다! 다시 한 번 대단히 감사합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top