2013-06-29 1 views
0

im пытается скопировать массив const char в какое-то место в памяти и указывать на него.указатель, malloc и char в C

позволяет сказать им определения этого вар под основной прог:

char *p = NULL; 

и отправить его в функцию со строкой:

myFunc(&p, "Hello"); 

теперь я хочу, чтобы в конце этой функции указатель укажет на букву H, но если я поместил(), он будет печатать Hello.

вот что я пытался сделать:

void myFunc(char** ptr , const char strng[]) { 
    *ptr=(char *) malloc(sizeof(strng));  
    char * tmp=*ptr; 
    int i=0; 
    while (1) { 
     *ptr[i]=strng[i]; 
     if (strng[i]=='\0') break; 
     i++; 
    } 
    *ptr=tmp; 
} 

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

также я попытался сделать аргумент ptr byreferenec (как & ptr), но без успеха из-за проблемы с lvalue и rvalue.

Единственная вещь меняющаяся для меня функция, и я бы хотел не использовать строки, но символы как это, так и упражнения.

благодарит за любую помощь заранее.

+0

Почему ты пытаясь использовать управление памятью C в C++? –

+0

thats способ, которым я хочу это сделать (без использования новой команды), на самом деле упражнение находится на C, но у меня есть только Visual C++ на моем ПК. – user2534078

+1

Тогда вы должны пометить свой вопрос 'C', иначе вы получите ответы' C++'. – juanchopanza

ответ

3

Просто замените все char* на std::string. Сделайте это до тех пор, пока у вас не возникнет особая причина не использовать существующие утилиты, что у вас нет в качестве новичка. Ни один из приведенных выше кодов не требует malloc() или необработанных указателей.

еще несколько заметок:

  • const char strng[] в качестве параметра такой же, как const char* strng. Синтаксис массива не делает его массивом, он остается указателем. Я не использую этот синтаксис, чтобы избежать этой путаницы.
  • Используйте static_cast или одну из других отливок C++, а не C-стиль, такой как (char*)malloc(..). Причина в том, что они безопаснее.
  • Проверьте возвращаемое значение malloc(), оно может вернуть значение null. Кроме того, вы должны позвонить в free() в конце концов, иначе ваше приложение будет утечки памяти.

И, наконец, указатель указывает на «H», который является только первым элементом строки. Выход *p вместо p, чтобы увидеть это.

1

Вы код работать по желанию, за исключением

*ptr[i]=strng[i]; 

должен быть

(*ptr)[i]=strng[i]; 

Без скобок, он действует как `* (PTR [я]) = strng [я];

2) Также

malloc(sizeof(strng)); 

s/б

malloc(strlen(strng)+1); 

Вы можете посмотреть на strdup(strng).


[править на запрос OP в]

разница между*(ptr[i]) и (*ptr)[i]

// OP desired function 
(*ptr)[i] = 'x'; 
// Dereference ptr, getting the address of a char *array. 
// Assign 'x' to the i'th element of that char * array. 

// OP post with the undesired function 
*(ptr[i]) = 'x'; 
// This is like 
char *q = ptr[i]; 
*q = 'x'; 
// This make sense _if_ ptr were an array of char *. 
// Get the i'th char * from ptr and assign to q. 
// Assign 'x' to to the location pointer to by q. 
+1

Также рекомендуем проверить результат malloc для NULL, так как это хорошая практика программирования. – chux

+0

спасибо большое !!! вы можете уточнить разницу между * (ptr [i]) и (* ptr) [i]? во-первых, это значение указателя памяти, но + i располагается вперед, а второе -? – user2534078

+0

@ user2534078 '(* ptr) [i]' является указателем на массив из i элементов. – 0decimal0

0

Это весь код нужно ... больше ничего ...

void myFunc(char **pp, char * str){ 
*pp = str; 

}

Единственная проблема здесь в том, что «Hello» находится в разделе только для чтения, потому что это постоянная строка ... так что вы не можете изменить «Hello» к чему-то еще ...