Изнутри контейнера localhost
всегда ссылается на текущий контейнер. Он никогда не ссылается на другой контейнер, и он никогда не ссылается ни на что другое, работающее на вашей физической системе, которое находится не в одном контейнере. Обычно не рекомендуется делать исходящие подключения к localhost
или настраивать localhost
как ваш хост базы данных.
Из оболочки вашей хост-системы localhost
может ссылаться на демоны, запущенные в вашей системе вне Docker , или портам, которые вы опубликовали с параметрами docker run -p
.
Из другой системы localhost
ссылается на систему, из которой она вызывается.
Что касается IP-адресов, localhost
всегда 127.0.0.1, и этот IP-адрес является особым и всегда localhost
и ведет себя так же, как указано выше.
Если вы хотите подключиться к контейнеру. ..
... из другого контейнера, лучший способ - убедиться, что они находятся в одной сети Docker (вы запустили их из того же файла DAMK, создающего YAML, вы сделали docker network create
и затем docker run --net ...
в той же сети) и использовать внутреннюю службу DNS Docker, чтобы ссылаться на них с помощью контейнера --name
или его имени в файле Docker Compose YAML и номере порта внутри контейнера. Даже если цель имеет опубликованный порт с параметром docker run -p
или Docker Compose ports:
, используйте номер порта second (контейнер-внутренний).
... со стороны Docker, убедитесь, что вы запустили контейнер с опцией docker run -p
или Docker Compose ports:
и подключитесь к IP-адресу хоста хоста, используя первый номер порта из этой опции.
... из окна терминала или браузера на том же физическом хосте, а не в контейнере, в этом случае и только в этом случае localhost
будет работать последовательно.
За исключением:
Если вы запустили контейнер с --net host
, localhost
ссылается на физический хост, и вы находитесь в сценарии «окно терминала на одном физическом узле».
Если вы не можете использовать несколько серверов в одном контейнере, вы можете использовать localhost
для связи между ними.
Если вы работаете в Kubernetes и у вас есть несколько контейнеров в одном контейнере, вы можете использовать localhost
для связи между ними. Между пакетами вы должны настроить службу перед каждым модулем / развертыванием и использовать DNS-имена формы service-name.namespace-name.svc.cluster.local
.
Самый простой способ (для C99 и последний)
void printArry(int a, int b, int arr[a][b]){
/* what goes here? */
}
Но существуют и другие способы
void printArry(int a, int b, int arr[][b]){
/* what goes here? */
}
или
void printArry(int a, int b, int (*arr)[b]){
/* what goes here? */
}
и немного путают , который будет работать только как функция protype
void printArry(int a, int b, int arr[*][*]);
На самом деле это не ответ, а расширенный комментарий к комментарию вопроса OP: «ну, вы можете передать массив, не зная количества строк с этим, но тогда как вы узнаете, когда прекратить печать строк?»
Ответ: как правило, вы не можете, не передавая размер массива тоже. Посмотрите на этот 1-D пример, который разбивает размер массива.
#include <stdio.h>
int procarr(int array[16], int index)
{
return array[index];
}
int main (void)
{
int arr[16] = {0};
printf("%d\n", procarr(arr, 100));
return 0;
}
Вывод программы (хотя все элементы, инициализированные на 0
):
768
Это было неопределенное поведение и не было предупреждения о компиляторе. C не обеспечивает защиту от переполнения массива, за исключением инициализаторов определения массива (хотя такие инициализаторы могут определять длину массива). Вы также должны передать размер массива, как в
#include <stdio.h>
int procarr(int array[16], size_t index, size_t size)
{
if (index < size)
return array[index];
return -1; // or other action / flag
}
int main (void)
{
int arr[16] = {0};
printf("%d\n", procarr(arr, 100, sizeof arr / sizeof arr[0]));
return 0;
}
Выход программы:
-1