#c #arrays #multithreading
#c #массивы #многопоточность
Вопрос:
Я хочу определить массив вне функции main, чтобы он был общим для всех потоков, а не только для основного потока. Когда пользователь запускает программу, его аргументом должен быть размер массива. Как я могу достичь этого в C?
Ответ №1:
Вы не можете с истинным массивом. Вы можете сделать это с помощью указателя:
int *p;
int main(int argc, char *argv[])
{
size_t x;
if (argc < 2)
return;
size_t x = strtoul(argv[1], NULL, 10);
p = malloc(x * sizeof *p);
return 0;
}
Комментарии:
1. 1 приятно! Как я могу получить доступ к его элементу? Это похоже
p[0] p[1] ... p[n]
?2. @Eng. Фуад, вот так. В большинстве случаев вы можете использовать его как массив. Но помните, что это не массив .
Ответ №2:
Поскольку вы не будете знать длину массива при его объявлении, он должен быть динамически распределяемым массивом.
(Обратите внимание, что это было бы верно, даже если бы вы хотели получить доступ только к массиву в main(), хотя многие компиляторы имеют расширения, которые допускают int a[n];)
int * myarray;
int myarray_count;
int main(int argc, const char * const * argv)
{
myarray_count = atoi(argv[1]);
myarray = malloc(myarray_count * (sizeof myarray[0]));
// ...
return 0;
}
Поскольку myarray не может быть статическим массивом, sizeof myarray не вернет размер выделенного массива, поэтому вы, вероятно, захотите сохранить счетчик рядом с ним.
Комментарии:
1. просто побочное замечание,
int a[n];
область действия функции in не является расширением. Он называется «массив переменной длины» и является неотъемлемой частью стандарта C с 1999 года.
Ответ №3:
int *a;
int a_c;
int main(int argc, char *argv[])
{
int i=0;
if (argc < 2)
return;
a_c= atoi(argv[1]);
a= malloc(a_c* (sizeof(int)));
// ...
for(i=0;i<a_c;i )
{
printf("n %d",a[i]);
}
return 0;
}