Выделение памяти в C

Используя Studio управления MSSQL я перешел таблицы с MySQL OLE DB. Щелкните правой кнопкой по своей базе данных и перейдите к "Задачам-> Данные Экспорта", оттуда можно определить источник MsSQL OLE DB, источник MySQL OLE DB и создать отображения столбца между этими двумя источниками данных.

Вы, скорее всего, захотите установить базу данных, и таблицы заранее на месте назначения MySQL (экспорт захочет составить таблицы автоматически, но это часто приводит к отказу). Можно быстро составить таблицы в MySQL с помощью "Задач->, Генерируют Сценарии" путем щелчка правой кнопкой по базе данных. Как только Ваши сценарии создания сгенерированы, необходимо будет ступить через и искать/заменять ключевые слова и типы, которые существуют в MSSQL к MySQL.

, Конечно, Вы могли также скопировать базу данных как нормальный и найти утилиту, которая восстановит резервное копирование MSSQL на MySQL. Я не уверен, существуете ли Вы как бы то ни было.

5
задан Ned Batchelder 31 October 2009 в 18:22
поделиться

3 ответа

В дополнение к основным проблемам, на которые указал Нед Батчелдер , гораздо более тонкая проблема заключается в том, что распределитель должен возвращать адрес, который правильно выровнен для любого выделяемого объекта . На некоторых платформах (x86) это может не иметь значения, за исключением проблем с производительностью, но на многих платформах это полный отказ.

Мне также пришлось выполнить приведение (char *) для выполнения ] stack арифметика указателя (вы не можете выполнять арифметику указателя для типов void * ).

И вы должны заключить выражение в скобки в макросе MAX_MEMORY . Я не думаю, что без них вы столкнетесь с какими-либо проблемами с приоритетом, поскольку все операторы с более высоким приоритетом, чем умножение, в любом случае не будут правильным синтаксисом. С макросами всегда лучше перестраховаться, чем сожалеть. (Есть по крайней мере одно исключение, когда оператор [] может связываться только с 2 , а не со всем выражением MAX_MEMORY , но было бы очень странно увидеть MAX_MEMORY [arrayyname] , даже если он синтаксически действителен).

На самом деле, я бы сделал это перечислением.

Вы, вероятно, можете упростить распределитель, вернув блок памяти, который правильно выровнен для любого базового типа данных в системе (возможно, 8-байтовое выравнивание):

/* Note: the following is untested                   */
/*       it includes changes suggested by Batchelder */

#include <stdio.h>
#include <unistd.h>

enum {
    kMaxMemory = 1024 * 1024 * 2, /* 2MB of memory */
    kAlignment = 8
};

void *stack = NULL; /* pointer to available stack */
void * memoryAlloc( size_t size) {
    void *pointer;

    size = (size + kAlignment - 1) & ~(kAlignment - 1);   /* round size up so allocations stay aligned */

    if (stack == NULL)
    stack = sbrk(kMaxMemory); /* give us system memory */

    pointer = stack; /* we always have space :) */
    stack = (char*) stack + size;   /* move in stack forward as space allocated */
    return pointer;
}
11
ответ дан 18 December 2019 в 08:29
поделиться

Есть несколько проблем:

  1. Вы объявляете указатель в середине функции, что недопустимо в C.

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

  3. Когда вы выполняете stack + = size , вы увеличиваете стек. не размером байтов, а размером size void *, который почти всегда больше.

6
ответ дан 18 December 2019 в 08:29
поделиться

Во-первых, как уже отметили другие, вы объявляете переменные в середине блока, что разрешено только в C99, но не в C89 / 90. Т.е. мы должны сделать вывод, что вы используете C99.

Во-вторых, вы определяете свою функцию в стиле K&R (без типа параметра), но в то же время не объявляете тип параметра позже. Таким образом, вы полагаетесь на правило "implicit int", которое запрещено в C99. Т.е. мы должны сделать вывод, что вы не используете C99. Это уже противоречие с «первой» частью. (Кроме того, для представления концепции «размера объекта» принято использовать беззнаковые типы. size_t - это специальный тип, обычно используемый для этой цели).

В-третьих, вы используете арифметику указателей для указателя void * , что всегда недопустимо как в C89 / 90, так и в C99. Я даже не знаю, что из этого можно сделать:)

Пожалуйста, решите, какой язык вы пытаетесь использовать, и мы пойдем дальше.

2
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

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