• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Заполнение массива в С и структуры

  • Автор темы misterio
  • Дата начала
M

misterio

1)Вообщем постала у меня такая нелепая проблема во время перехода с Delphi на С++ - не могу заполнить целочисленный массив:

Код:
int mass[10];
int i;
...
for (i = 0; i<10; i++) {
scanf("%d", mass[i]);
}

В итоге имеем Access Violation. Где подвох?
И вообще как можно вместо того, чтобы писать (i < 10), написать, что-то типа... (i < /количества елеметнов mass/).

2)

Код:
struct man {
char name;
int phone;
} me;
...
me.phone = 123; //тут все ОК.
me.name = "Жека" // а вот тут возникает ошибка. Я написал так : strcpy(me.name,"Жека") - сработало, но есть ли другой споспоб?
 
S

shisik

1) Функция scanf принимает параметр типа указатель: scanf("%d", &mass); Хотя я бы написал scanf("%d", mass + i);
Размер массива можно узнать написав sizeof(mass) / sizeof(int);

2) Вместо char name; нужно указать char *name; (или char name[длина_строки]; ). В первом случае это будет лишь указатель на строку, а физически данные будут расположены в другом месте и если указатель ссылается на константу (как в данном случае), то строку нельзя будет изменять. Во втором случае будет выделена память под строку, но копировать можно только через strcpy или в цикле (strcpy фактически это и делает).
 
M

misterio

Опять же еще 1 проблема :

Код:
...
#define num 4
...
void get_m (int *m[num])
{
register int i;

for(i = 0; i < num; i++)
scanf("%d", &m[i]);
}
...
int main (void)
{
int matrix[num];

get_m(&matrix[num]);

return 0;
}

Да..вроде бы все должно работать - передача параметра по ссылке, но после ввода 4 чисел - Access Violation.
 
G

gamecreator

попробуй
Код:
void get_m (int m[num])
...
int main (void)
{
...
get_m(matrix);
...
}
 
M

misterio

Это вроде в С++ так? A вопрос по C,а вообще суть в том, чтобы в удаленной функции заполнился массив matrix[num], который находиться в основной и не объявлен как глобальный!
 
S

shisik

Кто ж так массивы передаёт?
Код:
void get_m (int *m, int num)
{
register int i;

for(i = 0; i < num; i++)
scanf("%d", m + i);
}

int main (void)
{
int num = 4;

int *matrix = new int[num];

get_m(matrix, num);

delete [] matrix;

return 0;
}
Хотя вариант, предложенный gamecreator тоже будет работать. Но только если размер массива известен заранее...
 
M

misterio

Кто ж так массивы передаёт?

Ну знаете...всю жизнь на Pascal..а тут на тебе столько работы с указателем.
А это можно записать так :
Код:
int *matrix[num];
и какая разница? У меня слово new ассоциируется с ActionScript.
 
M

misterio

ActionScript - язык сценариев. Используеться в основном в Macromedia Flash. Я когда - то очень давно, там делал ДАРТС - пришлось подучить немного. <<-- ФЛУД.
 
S

shisik

А это можно записать так :
Код:
int *matrix[num];
и какая разница? У меня слово new ассоциируется с ActionScript.
Нет, это будет другое объявление. В первом случае выделяется память под определённое число элементов типа int, а у тебя под элементы типа указатель на int. Кроме того, new выделает память во время выполнения программы.
Моя запись равна int matrix[num];, только num должно быть константой...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!