2015-04-14 5 views
-1

У меня следующий фрагмент кодаКак исправить доступа исключение нарушение письма

#include <stdio.h> 
#include<conio.h> 
#include <ctype.h> 
char *convertire(char *sir) 
{ 
    char *sir2=""; 
    while (*sir) 
    { 
     *sir2 = toupper(*sir); 
     sir++; 
    } 
    return (sir2); 
} 
void main(void) 
{ 
    char *sir = "Home is good"; 
    char *sir2 = convertire(sir); 
    printf("Sirul obtinut este : %s\n", sir2); 
    _getch(); 
} 

Когда я пытаюсь скомпилировать я получаю следующее сообщение об ошибке

First-chance exception at 0x00E3141B in pointeri.exe: 0xC0000005: Access violation writing location 0x00E35858. If there is a handler for this exception, the program may be safely continued. 

Можете ли вы помочь мне решить эту проблему?

+0

Что ваш вопрос? – unwind

+1

Непонятно, что вы просите, пожалуйста, напишите ваши вопросы как можно более подробно. – Muds

+0

Когда я пытаюсь построить этот код, компилятор покажет мне следующее: Исключение из первого шанса в 0x00E3141B в pointeri.exe: 0xC0000005: место записи нарушения доступа 0x00E35858. Если есть обработчик для этого исключения, программа может быть безопасно продолжена. Поэтому я не могу скомпилировать этот код. В чем проблема? Спасибо – Constantin

ответ

1
char *sir2=""; 

Там не хватает памяти, выделенной для указателя sir2, а также только для чтения.

Вам нужно что-то вроде

char *sir2 = malloc(strlen(sir1) + 1); 

Доступ нераспределенной памяти приводит к непредсказуемому поведению и может привести к аварии. Это невозможно обработать каким-либо другим способом, кроме выделения памяти для вашего указателя.

+0

Действительно ли это _no memory_? –

+1

Программа не будет работать так, как ожидалось, когда это будет сделано. Я считаю, что OP хочет загладить каждую букву 'sir' и хранить ее в' sir2', а затем напечатать 'sir2'. –

+1

@ Jongware Да, вы правы. Я исправил свои формулировки сейчас – Gopi

2

Вам также необходимо отслеживать начало sir2, в основном вы должны изменить convertire() вроде этого:

char *convertire(char *sir) 
{ 
    char *p; 
    char *sir2=(char *)malloc(strlen(sir)+1); 
    p = sir2; 
    while (*sir) 
     { 
     *sir2++ = toupper(*sir++); 
     } 
    return p; 
} 
+0

Не бросайте результат 'malloc' в C. –

+0

Справедливости ради, хотя это хорошее наблюдение, это не то, что ОП спросил: P Возможно, вы заставили его пропустить важный урок: создание компиляции программы * автоматически не означает, что он делает то, что хочет. – usr2564301

+0

@ Jongware, мне показалось, что OP хотел получить «Home is good», преобразованный в верхний регистр, что-то вроде «HOME is GOOD», и это произойдет с вышеперечисленным конвертиром(). Таким образом, обе цели выполняются здесь, программа компилирует и обеспечивает желаемый результат. – nkb