Что с ним не так
Код, который у вас есть - я не могу найти ошибку. Единственная проблема, которую я замечаю, заключается в том, что если вы вообще не предоставите номер, то эта часть причинит вред:
(synsAux.size()-1)
Вычтет одно из 0u. Это обернется, потому что size()
возвращает тип целого без знака. В итоге вы получите очень большое значение, где-то около 2 ^ 16 или 2 ^ 32. Вы должны изменить целое условие while на
while ((index+1) < synsAux.size())
Вы можете попытаться найти ошибку вокруг стороны вызова. Часто случается, что где-то до этого происходит переполнение буфера или повреждение кучи, и в результате этого происходит сбой программы на более позднем этапе программы.
Аргументы и параметры в нем
Что касается массива и того, как он передается, я думаю, вы все делаете правильно. Хотя вы все равно передаете массив по значению. Может быть, вы уже знаете это, но я повторю это. Вы действительно передаете указатель на первый элемент этого массива:
char matrizSinonimos[1024][1024];
2d-массив действительно является массивом массивов. Первый элемент этого массива - это массив, а указатель на него - указатель на массив. В этом случае это
char (*)[1024]
Несмотря на то, что в списке параметров вы сказали, что вы принимаете массив массивов, компилятор, как всегда, корректирует это и делает его указателем на первый элемент такого массива. Таким образом, в действительности у вашей функции есть прототип, после того как компилятор выполнит корректировку типов аргументов:
void pushSynonyms (string synline, char (*matrizSinonimos)[1024]);
Хотя часто предлагается, Вы не можете передать этот массив как char**
, потому что вызываемая функция нуждается в размере внутреннего измерения, чтобы правильно адресовать подразмеры с правильными смещениями. Работая с char**
в вызываемой функции, а затем записывая что-то вроде matrizSinonimos[0][1]
, он попытается интерпретировать первый размер символов (char **) этого массива как указатель и попытается разыменовать случайную ячейку памяти затем делаю это во второй раз, если между ними не произойдет сбой. Не делай этого . Также не имеет значения, какой размер вы записали во внешнем измерении этого массива. Это рационализировало прочь. Теперь не очень важно передавать массив по ссылке. Но если вы хотите, вы должны изменить всю вещь на
void pushSynonyms (string synline, char (&matrizSinonimos)[1024][1024]);
Передача по ссылке не передает указатель на первый элемент: все размеры всех измерений сохраняются, и передается сам объект массива, а не значение.