Чтобы узнать, что происходит, вы должны понять структуру памяти программы C.
char *s = "sample"; // Here the "sample" string is placed in
// the read only memory of the Initialized Data segment.
Здесь вы не можете изменять данные. «s
» является указателем на char const
(«образец»), и вы пытаетесь изменить char const
. Вот почему вы получаете ошибку bus error
.
|Stack frame of main() |
|char *s |
|-------------------------------|
|Stack frame of reverse() |
|char *end |
|char tmp |
| |
|-------------------------------|
| |
| |
| |
| |
| |
|-------------------------------|
| |
| HEAP |
| |
|-------------------------------|
| |
| UNINITIALIZED DATA (BSS) |
| |
|-------------------------------|
| |
| INITIALIZED DATA |
| |
|"sample" | |
| | |
|(Read Only)| (Read/Write) |
|-------------------------------|
| Text or Code Segment |
| |
|-------------------------------|
UPDATE Ниже пост не имеет отношения к вашему вопросу.Но если вы знаете, где память, выделенная для всех переменных в C, вы можете лучше кода. Нижеприведенная программа дает лучшее представление о макете памяти программы C. Я не включил аргументы командной строки, аргумент функции и возвращаемые значения функции на диаграмме. Люди, которые хотят обновить это сообщение, могут добавить в диаграмму аргументы командной строки, аргумент функции и вернуть значения функции.
|Stack frame of main() |
|local_To_Main |
| | #include <stdio.h>
|-----------------------------------| #include <stdlib.h>
|Stack frame of function1() | int gVariable1 = 100;
|local_To_Function1 | int gVariable2;
|iptr | char cstring[10] = "Hello";
| \ STACK | char* cptr = "Hello World";
|------\---------------|------------| void function1(void)
| \ \|/ | {
| \ | static int j = 5;
| \ | int local_To_Function1;
| \ ^ | int *iptr;
| \ | | iptr = (int *) malloc(sizeof(int));
|------------\---------------|------| free(iptr);
| HEAP \ --- | }
| \---> |int| |
| --- | int main(void)
|-----------------------------------| {
| | static int i;
| UNINITIALIZED DATA (BSS) | int local_To_Main;
|gVariable2(initialized to 0) |
|i (initialized to 0) |
|-----------------------------------| function1();
| | return 0;
| INITIALIZED DATA | }
| |
|"Hello World" |gVariable1 =100 |
| ^ |cstring="Hello" |
| | |j=5 |
| |---<---<---- cptr |
|(Read Only) | (Read/Write) |
|-----------------------------------|
| Text or Code Segment |
| |
|-----------------------------------|
Я абсолютно уверен, вы имели в виду 'Е ("% s \ п", с);'. – cHao
Вы должны были написать 'const char * s =" sample ";'. Понял? Вы знаете, почему строковые константы называются константами? Нет? Лучше google это. –