Недопустимый converstion от пустоты* для обугливания **

Внешние ключи являются лучшим способом гарантировать ссылочную целостность базы данных. Предотвращение каскадов из-за того, чтобы быть волшебным похоже на запись всего в блоке, потому что Вы не доверяете волшебству позади компиляторов.

то, Что плохо, является неправильным использованием внешних ключей, как создание их назад, например.

примером Juan Manuel является канонический пример при использовании кода существует намного больше возможностей отъезда побочного DocumentItems в базе данных, которая прибудет и укусит Вас.

Каскадные обновления полезны, например, когда у Вас есть ссылки на данные чем-то, что может измениться, сказать, что первичный ключ пользовательской таблицы является именем, lastname комбинация. Тогда Вы хотите, чтобы изменения в той комбинации распространили к тому, везде, где на них ссылаются.

@Aidan, Та ясность, к которой Вы обращаетесь, прибывает в высокую стоимость, шанс отъезда побочных данных в Вашей базе данных, которая является не маленькая . Мне это - обычно просто отсутствие знакомства с DB и неспособностью найти, какие FKs существуют прежде, чем работать с DB, это способствует тому страху. Или это или постоянное неправильное употребление каскада, с помощью него, где объекты не были концептуально связаны, или где необходимо сохранить историю.

6
задан Mr Lister 9 May 2012 в 13:11
поделиться

2 ответа

Добавлено: Быстрое решение реальной проблемы Аррона предоставляется sgm в комментарии. Приведенный ниже текст является точным и, надеюсь, полезным, но это второстепенное решение проблемы.


Ваш компилятор очень жестко относится к приведению указателей (вы используете компилятор C ++?), Добавляя явное приведение типа

sequence=(char**)malloc(sizeof(char *)*seqNum);

должен устранить ошибку. В качестве альтернативы вы можете убедить компилятор пойти на уступки с помощью какой-нибудь опции вроде

$(CC) --lighten-up-baby code.c

, которая может быть предпочтительнее, если она находится в каком-то стороннем коде, который вы действительно не хотите взламывать. Прочтите документацию к вашему компилятору, чтобы найти нужный вариант. Поскольку все имеющиеся у меня gcc (версии 4.0 и 4.2) довольны этим кодом, я не могу давать советы по переключателям, чтобы отключить это поведение.

7
ответ дан 9 December 2019 в 20:47
поделиться

Вам нужно привести результат malloc к желаемому типу.

Итак:

 char **sequence;
 ...
 sequence = (char **)malloc(sizeof(char *) * seqNum);

Также помните, что если вы собираетесь использовать последовательность, вам необходимо выделить список "char *", как вы это сделали, но тогда у вас нет выделенной памяти , он выделяет место только для самого списка указателей.

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

5
ответ дан 9 December 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: