传递数组以进行内存分配

时间:2016-10-19 02:02:35

标签: c arrays memory malloc

我对此代码有疑问:

主():

...
int main()
{

    int i=0, choice=0;

    int *array_val=NULL;

    while((choice=menu_sort())!=9)
    {

        switch(choice)
        {
        case 1:
            i=ins_val(&array_val, i);
            break;
....

我从另一个来源调用ins_val()函数:

int ins_val(int **array_val, int i)
{

    int j=0, add=0, k=0;

    system("cls");

    printf("Number to add: ");
    scanf("%d", &add);

    i++;

    reall(array_val, i);

    *array_val[i-1]=add;

    for (j=(i-1); j>0; j--)
    {

        if (*array_val[j]<(*array_val[j-1]))
        {

            k=(*array_val[j-1]);
            *array_val[j-1]=(*array_val[j]);
            *array_val[j]=k;

        }

    }

    return i;

}

void reall(int **array_val, int i)
{

    int *arr=NULL;
    arr=malloc(sizeof(int)*i);

    int j=0;

    for (j=0; j<i-1; j++)
    {

        arr[j]=(*array_val[j]);

    }

    int size=(sizeof(int)*i);

    free(*array_val);

    (*array_val)=(int*)malloc(size);

    if ((*array_val)!=NULL)
    {

        for (j=0; j<i-1; j++)
        {

            (*array_val[j])=arr[j];

        }

        free(arr);

    }

    else
    {

        ...

    }

    return;

}

我想创建一个动态数组,我可以在其中保存值并对其进行排序。

我的问题是内存分配,因为我只能在array_val数组中保存一个值,即使malloc()我分配sizeof(int)*i,所以当我尝试保存时第二个值我得到一个错误。

1 个答案:

答案 0 :(得分:0)

您需要更改您的分配:

// just some valid rectangle arguments
int x = 0;
int y = 0;
int width = 10;
int height = 20;
// our rectangle...
cv::Rect rect(x, y, width, height);
// and its top left corner...
cv::Point pt1(x, y);
// and its bottom right corner.
cv::Point pt2(x + width, y + height);
// These two calls...
cv::rectangle(img, pt1, pt2, cv::Scalar(0, 255, 0));
// essentially do the same thing
cv::rectangle(img, rect, cv::Scalar(0, 255, 0))

为:

self.webView.stringByEvaluatingJavaScript(from: "document.body.style.zoom = 1.5;")

此外,您有两个缺少索引的循环:

(*array_val[j])=arr[j];

这应该是:

(*array_val)[j] = arr[j];

但是,当您将for (j=0; j<i-1; j++) 传递给for (j = 0; j < i; j++) 时,段错误是因为*array_val = NULLins_val()中的此代码需要更改为:

reall()

这样的事情:

for (j=0; j<i-1; j++)
{

    arr[j]=(*array_val[j]);

}

int size=(sizeof(int)*i);

free(*array_val);

在此循环中,您尝试取消引用空指针,因为if (*array_val) { for (j=0; j<i; j++) arr[j]=(*array_val)[j]; free(*array_val); } int size=(sizeof(int)*i); 最初为NULL。