char* foo = (char*) malloc(sizeof(char)*50); foo = "testing";
In C, i can see the first character of that string :
printf("%c",foo[0]);
But when i try to change that value :
foo[0]='f'
It gives error in runtime.
How can i change this, dynamically allocated, char array’s values?
Tim Cooper
156k38 gold badges325 silver badges276 bronze badges
asked May 14, 2011 at 16:15
You are setting foo to point to the string literal ("testing"
) not the memory you allocated. Thus you are trying to change the read only memory of the constant, not the allocated memory.
This is the correct code:
char* foo = malloc(sizeof(char)*50);
strcpy(foo,"testing");
or even better
cont int MAXSTRSIZE = 50;
char* foo = malloc(sizeof(char)*MAXSTRSIZE);
strncpy(foo,"testing",MAXSTRSIZE);
to protect against buffer over-run vulnerability.
answered May 14, 2011 at 16:17
HoganHogan
68.6k10 gold badges78 silver badges116 bronze badges
1
Your problem is that you are changing the pointer reference.
By doing :
char* foo = (char*) malloc(sizeof(char)*50); foo = "testing";
You are assigning the foo pointer to the "testing"
string that is stored somewhere (hens the runtime error i guess), not to the newly allocated space.
Hope this will help
answered May 14, 2011 at 16:20
sitifensyssitifensys
2,02416 silver badges29 bronze badges
With strings, you shouldn’t assign their values via the assignment operator (=
). This is because strings aren’t an actual type, they are just char pointers. Instead, you have to use strcpy
.
The problem with your code is that you have allocated memory for foo
, then you reassign foo
to a different memory address that is READONLY. When you assign to foo[0]
you get a runtime error because you are trying to write to readonly memory.
Fix your code by doing this:
char* foo = malloc(50);
strcpy(foo, "testing");
This works because foo
points to the address that you allocated.
answered May 14, 2011 at 16:18
MarlonMarlon
19.7k11 gold badges67 silver badges100 bronze badges
3
1.
name="Messi";
You can´t assign a char
array with a string unless at its initialization, which is done with:
char name[]="Ronaldo";
Rather use strcpy()
(Header string.h
) -> strcpy(name,"Messi");
instead.
Consider that the array name
needs to be capable of holding the new-assigned string + the null terminator, which is in this case provided because the string "Ronaldo"
has more characters than any of the following. If that would not be the case you have to define name
with an appropriate amount of characters or choose a name which is bigger than anyone else or the program would cause an overflow of data in memory.
2.
Note that the switch
statement doesn´t make sense if choice
is always 0
because you have never read input for choice
.
Also the cases
to the switch
are not enclosed by {
and }
which should give you a compilation error.
3.
choice
is initialized by a character. While this is permissible, it does not make sense in this case and confuses readers of your code. Rather use int choice = 0;
Corrected code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char name[]="Ronaldo";
int choice=0;
printf("Select Playern");
printf("1.Messin2.Suarezn3.Neymarn4.Dembelen5.Mullernn");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("nMessi is Selected");
strcpy(name,"Messi");
break;
case 2:
printf("nSuarez is Selected");
strcpy(name,"Suarez");
break;
case 3:
printf("nNeymar is Selected");
strcpy(name,"Neymar");
break;
case 4:
printf("nDembele is Selected");
strcpy(name,"Dembele");
break;
case 5:
printf("nMuller is Selected");
strcpy(name,"Muller");
break;
default:
printf("Exit");
exit(1);
}
printf("nPlayer changed to %s",name);
return 0;
}
Output:
/a.out
Select Player
1.Messi
2.Suarez
3.Neymar
4.Dembele
5.Muller
2 // Input from User
Suarez is Selected
Player changed to Suarez
1.
name="Messi";
You can´t assign a char
array with a string unless at its initialization, which is done with:
char name[]="Ronaldo";
Rather use strcpy()
(Header string.h
) -> strcpy(name,"Messi");
instead.
Consider that the array name
needs to be capable of holding the new-assigned string + the null terminator, which is in this case provided because the string "Ronaldo"
has more characters than any of the following. If that would not be the case you have to define name
with an appropriate amount of characters or choose a name which is bigger than anyone else or the program would cause an overflow of data in memory.
2.
Note that the switch
statement doesn´t make sense if choice
is always 0
because you have never read input for choice
.
Also the cases
to the switch
are not enclosed by {
and }
which should give you a compilation error.
3.
choice
is initialized by a character. While this is permissible, it does not make sense in this case and confuses readers of your code. Rather use int choice = 0;
Corrected code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char name[]="Ronaldo";
int choice=0;
printf("Select Playern");
printf("1.Messin2.Suarezn3.Neymarn4.Dembelen5.Mullernn");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("nMessi is Selected");
strcpy(name,"Messi");
break;
case 2:
printf("nSuarez is Selected");
strcpy(name,"Suarez");
break;
case 3:
printf("nNeymar is Selected");
strcpy(name,"Neymar");
break;
case 4:
printf("nDembele is Selected");
strcpy(name,"Dembele");
break;
case 5:
printf("nMuller is Selected");
strcpy(name,"Muller");
break;
default:
printf("Exit");
exit(1);
}
printf("nPlayer changed to %s",name);
return 0;
}
Output:
/a.out
Select Player
1.Messi
2.Suarez
3.Neymar
4.Dembele
5.Muller
2 // Input from User
Suarez is Selected
Player changed to Suarez
45 / 45 / 40 Регистрация: 31.08.2015 Сообщений: 147 |
|
1 |
|
30.06.2016, 22:47. Показов 3522. Ответов 4
Есть два элемента массива типа char(не по одному символу), нужно поменять их местами. Как это возможно сделать?
__________________
0 |
Morphiya 0 / 0 / 0 Регистрация: 30.06.2016 Сообщений: 7 |
||||
30.06.2016, 23:58 |
2 |
|||
Поменять элементы в одном массиве?
0 |
45 / 45 / 40 Регистрация: 31.08.2015 Сообщений: 147 |
|
01.07.2016, 00:17 [ТС] |
3 |
Мне нужно поменять местами целые строки то есть например есть массив x[n][10] мне надо поменять местами строки x[1] и x[2]
0 |
easybudda Модератор 11660 / 7173 / 1704 Регистрация: 25.07.2009 Сообщений: 13,142 |
||||||||||||
01.07.2016, 00:39 |
4 |
|||||||||||
РешениеСамый дурацкий способ:
Выпендрёжный способ
Быстрый
2 |
Catstail Модератор 33880 / 18907 / 3981 Регистрация: 12.02.2012 Сообщений: 31,705 Записей в блоге: 13 |
||||
02.07.2016, 19:35 |
5 |
|||
1 |
У меня есть этот заголовок:
MvProjectQueue & operator >> (char *);
И я должен написать функцию, отвечающую этой спецификации. (моя функция должна «вернуть» массив символов, используя >>
оператор)
Я должен изменить переданный аргумент, то есть, когда вызывается моя функция, я получаю массив char и мне нужно изменить его (на месте).
Обычно я бы использовал
MvProjectQueue & operator >> (char **);
получил указатель на char *
и я бы решил это легко, используя что-то вроде этого:
#include <iostream>
using namespace std;
class SimpleShowcaseObject
{
public:
SimpleShowcaseObject(){};
~SimpleShowcaseObject(){};
SimpleShowcaseObject & operator >> (char ** p_ch)
{
*p_ch = "changed";
cout << "in scope: " << *p_ch << endl;
return *this;
}
};
int main(void)
{
char *ch = new char[10];
ch = "hello";
SimpleShowcaseObject o = SimpleShowcaseObject();
cout << "original: " << ch << endl;
o >> &ch;
cout <<"changed: " << ch << endl;
delete[] ch;
cin.get();
return 0;
}
Но это:
#include <iostream>
using namespace std;
class SimpleShowcaseObject
{
public:
SimpleShowcaseObject(){};
~SimpleShowcaseObject(){};
SimpleShowcaseObject & operator >> (char *ch)
{
ch = "changed";
cout << "in scope: " << ch << endl;
return *this;
}
};
int main(void)
{
char *ch = new char[10];
ch = "hello";
SimpleShowcaseObject o = SimpleShowcaseObject();
cout << "original: " << ch << endl;
o >> ch;
cout <<"changed: " << ch << endl;
delete[] ch;
cin.get();
return 0;
}
выполняет и печатает:
original: hello
in scope: changed
changed: hello
и я хотел бы иметь
original: hello
in scope: changed
changed: changed
(отредактировано несколько раз, большое спасибо всем за попытку помочь!)
-4
Решение
Ваша функция получает то, что должно быть буфером, в который вы можете записать:
SimpleShowcaseObject & operator >> (char *ch)
{
//ch = "changed";// with this you are changing the value of the pointer, not what you want
strcpy (ch, "changed");
cout << "in scope: " << ch << endl;
return *this;
}
Как уже отмечали другие, это не очень хороший дизайн: ваш operator >>
должен написать строку (char[]
) в буфере, не зная длины входного буфера; не хороший сценарий.
0
Другие решения
Других решений пока нет …
Хорошо, у меня есть структура
typedef struct contact {
char firstName[32];
char lastName[32];
char address[100];
char city[32];
char state[32];
char zipcode[10];
} Contact;
И мне нужно сделать значение firstName равным «Herp»
Я пробовал что-то вроде этого:
int main(void) {
Contact contact;
contact.firstName = "Herp"; // I also tried the following line of code:
contact.firstName[] = "Herp"; // This doesn't work, and when I add a 0 to where the array needs to point, I get a syntax error.
}
Любая помощь будет большим.
4 ответы
Ваша структура отведет 32 байта памяти для .firstName
для каждого экземпляра, а также для другого char[]
полей.
Компания char[32]
буфер может быть прочитан, как будто это char*
указательная переменная, но если вы напишете contact.firstName = "Herp"
это как если бы вы пытались переназначить адрес памяти поля. Однако вы не можете этого сделать — адрес этого буфера фиксирован относительно начала всей структуры в памяти.
Следовательно, вы должны копия нужные данные из исходной строки в буфер.
В ограниченных случаях вы можете использовать strcpy
для этого, но в идеале вы должны использовать strncpy
вместо этого убедитесь, что вы не можете переполниться из одного поля в другое.
Остерегайтесь возможности того, что результирующий буфер не будет иметь конечного NUL
в нем, если исходная строка имела длину 32+ символа.
ответ дан 14 окт ’13, 18:10
Я проголосовал за ответ noelicus, но я чувствую, что нужно пойти немного дальше.
typedef struct contact {
char* firstName;
char* lastName;
char* address;
char* city;
char* state;
char* zipcode;
} Contact;
Тогда это сработает:
contact.firstName = "Herp";
Причина в том, что указатель будет установлен так, чтобы указывать на выделенное пространство, содержащее строку.
В вашем случае строка уже выделена, и вам нужно скопировать постоянную строку (строки C неизменяемы). Я бы сказал, что лучший способ сделать это:
strncpy(contact.firstName, "Herp", sizeof(contact.firstName));
Эта форма защитит от возможного переполнения стека. Вы никогда не сможете скопировать в целевую строку больше байтов, чем она может вместить.
ответ дан 14 окт ’13, 18:10
strcpy(contact.firstName,"Herp");
Вам нужно копия строку в массив символов (строку).
Использование квадратных скобок позволит получить доступ к символу в строке, например contact.firstName[0]
для доступа к первому символу.
Редактировать:
strcpy
это хорошее место для начала и изучения строк, но в реальной системе это небезопасно, так как он не будет проверять, есть ли место в буфере, в который вы копируете. Если вы хотите узнать больше о безопасной обработке строк, попробуйте strcpy_s и т.д. — чтобы быть в безопасности, функциям необходимо указать максимальный размер массива/строки, например, с помощью Макрос РАЗМЕР МАССИВА.
ответ дан 23 мая ’17, 12:05
Если вы хотите избежать переполнения буфера
strncpy(contact.firstName,"Herp",32);
Убедитесь, что значение, которое вы передаете как «Herp», не может содержать более 31 символа, как объяснил Alnitak
ответ дан 14 окт ’13, 18:10
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
c
or задайте свой вопрос.
28.12.2019C Программы, Массивы
В этой статье объясняется, как установить или изменить значение массива unsigned char во время выполнения в C.
Данный:
Предположим, у нас есть массив без знака размера n
unsigned char arr[n] = {}; // currently arr = {'', '', '', ...}
Сделать:
Мы хотим установить или изменить значения этого массива во время выполнения.
Например, мы хотим сделать массив
arr = {'1', '2', '3', ...}
Решение:
Это может быть достигнуто с помощью метода memcpy () . memcpy () используется для копирования блока памяти из одного места в другое. Он объявлен в string.h
Синтаксис:
// Copies "numBytes" bytes from address "from" to address "to" void * memcpy(void *to, const void *from, size_t numBytes);
Ниже приведена реализация вышеуказанной программы:
#include <stdio.h>
#include <string.h>
int
main()
{
unsigned
char
arr[3] = { 0 };
printf
(
"Initial unsigned char array:n"
);
for
(
size_t
i = 0; i <
sizeof
(arr) /
sizeof
(arr[0]); i++) {
printf
(
"%c "
, arr[i]);
}
printf
(
"n"
);
memcpy
(arr,
(unsigned
char
[]){
'1'
,
'2'
,
'3'
},
sizeof
arr);
printf
(
"Updated unsigned char array:n"
);
for
(
size_t
i = 0; i <
sizeof
(arr) /
sizeof
(arr[0]); i++) {
printf
(
"%c "
, arr[i]);
}
printf
(
"n"
);
return
0;
}
Рекомендуемые посты:
- символ без знака в C с примерами
- размер типа данных char и массива char в C
- C / C ++ программа для поиска размера int, float, double и char
- Максимальная длина палиндромной подстроки, так что она начинается и заканчивается данным символом
- Найти исходный массив из зашифрованного массива (массив сумм других элементов)
- Найти элемент в массиве так, чтобы сумма левого массива была равна сумме правого массива
- Минимальная стоимость достижения конца массива массива, когда разрешен максимальный скачок индекса K
- Подсчитать количество перестановок массива, не имеющего вложенного массива размером два или более из исходного массива
- Минимальное число больше максимального массива, которое не может быть сформировано с использованием чисел в массиве
- Найдите минимальное значение, чтобы назначить все элементы массива так, чтобы произведение массива стало больше
- Увеличьте размер массива, удалив ровно k подмассивов, чтобы сделать массив простым
- Генерация исходного массива из массива, который хранит количество больших элементов справа
- Печать измененного массива после нескольких операций увеличения диапазона массива
- Проверьте, существуют ли два элемента в массиве, сумма которых равна сумме остатка массива
- Учитывая отсортированный массив и число x, найдите пару в массиве, сумма которой ближе всего к x
Установить значение массива unsigned char в C во время выполнения
0.00 (0%) 0 votes