2012-04-21 4 views
1

Когда я пытаюсь выполнить компиляцию следующего кода на C, я получаю ошибку шины. Я предполагаю, что это имеет какое-то отношение к тому, как я назвал memcpy, однако я не могу понять это. Любая помощь будет принята с благодарностью!Ошибка шины: 10. C-код, пример malloc

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

int main() 
{ 

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p 
    p = "hello"; 


    char *name = (char*)malloc(sizeof(char)*11); 
    // Assign some value to name 
    name = "Bye"; 

    memcpy (p,name,sizeof(char)*10); // Problem begins here 
    return 0; 
} 
+0

Другие примечания: [Не бросайте возвращаемое значение malloc] (http://stackoverflow.com/questions/605845/). Почему вы используете 'memcpy' для копирования * строк *, когда для этой цели существуют' strncpy' и подобные функции? – DCoder

ответ

8

Здесь p указывает на строку буквального после вашего назначения, а не вашей выделенной памяти!

Затем вы пытаетесь записать в эту память memcpy.

Многие компиляторы C выделяют строковые литералы в постоянной памяти, поэтому ошибка шины.

Чтобы устранить проблему, вы должны скопировать персонажи ч, е, л, л и о в пространство, которое вы назначили для p в первой строке main, используя strncpy. Это держит p, указывая на выделенную вами память; более поздний memcpy будет в порядке (при условии, что вы, конечно, не переполните свой буфер).

Обратите внимание, что в общем случае, когда вы напрямую привязываете строковую переменную, вы указываете переменную точку на другой адрес памяти. В вашем коде вы выделили место для нескольких строк, но когда вы назначаете строковые литералы для переменных, вы меняете местоположение, на которое они указывают, что вызывает утечку памяти.

+0

Есть ли способ писать на p? – Sid

+0

Ответил в редактировании. –

+0

Спасибо большое! Я пытался понять это сейчас! – Sid

0

В вашем коде p = "hello""hello" верните указатель, который указывает на строку hello, и привет не может быть изменен. Вы используете p = "hello" означает make p. Поэтому, когда вы попытаетесь изменить его, вы получите сообщение об ошибке. Правильный путь, как следует: char a[] = "hello"; или

char *a = malloc(sizeof(char)*11); /*cast is not good*/ 
strcpy (a, "hello"); 

BTW, используйте malloc лучше не используя актеров, как (char *) или (int *).