распределение памяти по двойному указателю - PullRequest
1 голос
/ 06 июля 2010

В настоящее время я пытаюсь выделить такой же объем памяти для двойного указателя.Я беру символ ** и хочу использовать пузырьковую сортировку на этом символе **.Поэтому я создаю временный символ **, и теперь мне интересно, как правильно выделить достаточно памяти, чтобы я мог вернуть этот временный символ ** другому методу.не выглядит правильно, и это, конечно, не работает ... иначе я бы не задавал этот вопрос.Если бы кто-нибудь мог ответить полезным советом, я был бы очень признателен!

char** bubble_sort(char **filenames, int n)
{
    int i;
    char **new_list;
    new_list = malloc(sizeof(filenames));
    for (i = 0; i < n; i++)
    {
       // malloc(file_list.size * sizeof(int));
        new_list[i] = filenames[i];
    }
    for (i = 0; i < n; i++)
    {
        printf("%d: %s\n", i, new_list[i]);
    }

    int x;
    int y;
    for(x=0; x<n; x++)
    {
            for(y=0; y<n-1; y++)
            {
                    if(new_list[y]>new_list[y+1])
                    {
                            char *temp = new_list[y+1];
                            new_list[y+1] = new_list[y];
                            new_list[y] = temp;
                    }
            }
    }
    for (i = 0; i < n; i++)
       {
           printf("%d: %s\n", i, new_list[i]);
       }
    return new_list;
}

Ответы [ 4 ]

2 голосов
/ 06 июля 2010
char** bubble_sort(char **filenames, int n) 
{ 
    int i; 
    char **new_list; 
    new_list = malloc(sizeof(filenames)); 

Этот код выделяет достаточно места для хранения одного указателя (sizeof(filenames), скорее всего, 4), и дает адрес этого указателя для new_list.Если вы хотите получить доступ к тому, на что new_list указывает как массив (и я знаю, что вы делаете, потому что вы пытались сделать именно это ниже), вам нужно выделить достаточно места для его элементов.

1 голос
/ 06 июля 2010

Вот рабочая копия программы:

#include <cstdio>
#include <cstdlib>
#include <cstring>

char** bubble_sort(const char **filenames, int n)
{
    int i;
    char **new_list;
    new_list = (char**) malloc(sizeof(*new_list) * n);
    for (i = 0; i < n; i++)
    {
        new_list[i] = (char*) filenames[i];
    }

    printf("Initial list:\n");
    for (i = 0; i < n; i++)
    {
        printf("%d: %s\n", i, new_list[i]);
    }

    int x;
    int y;

    printf("List is sorted:\n");
    for(x=0; x<n; x++)
    {
            for(y=0; y<n-1; y++)
            {
                    if(strcmp(new_list[y],new_list[y+1])>0)
                    {
                            char *temp = new_list[y+1];
                            new_list[y+1] = new_list[y];
                            new_list[y] = temp;
                    }
            }
    }
    for (i = 0; i < n; i++)
       {
           printf("%d: %s\n", i, new_list[i]);
       }
    return new_list;
}

int main(){
    const char *ar[5]={
        "eee", "aaa", "bbb", "ccc", "ddd",
    };
    bubble_sort(ar, 5);
    return (0);
}

Имейте в виду, что ваш стиль программирования больше напоминает C, чем C ++ (что не всегда плохо).

Если вы хотите выделить новые строки для элементов массива, вы должны изменить первую строку следующим образом:

for (i = 0; i < n; i++)
{
    //new_list[i] = (char*) filenames[i];
    new_list[i] = (char*) malloc(sizeof(**new_list) * (strlen(filenames[i]) + 1));
    strcpy(new_list[i], filenames[i]);
}

И это версия C (первой была C ++версия).Обратите внимание, что массив строк имеет все свои новые элементы и не использует начальные строки из входного параметра .:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** bubble_sort(char **filenames, int n)
{
    int i;
    char **new_list;
    new_list = malloc(sizeof(*new_list) * n);
    for (i = 0; i < n; i++)
    {
        //new_list[i] = (char*) filenames[i];
        new_list[i] = malloc(sizeof(**new_list) * (strlen(filenames[i]) + 1));
        strcpy(new_list[i], filenames[i]);
    }

    printf("Initial list:\n");
    for (i = 0; i < n; i++)
    {
        printf("%d: %s\n", i, new_list[i]);
    }

    int x;
    int y;

    printf("List is sorted:\n");
    for(x=0; x<n; x++)
    {
            for(y=0; y<n-1; y++)
            {
                    if(strcmp(new_list[y],new_list[y+1])>0)
                    {
                            char *temp = new_list[y+1];
                            new_list[y+1] = new_list[y];
                            new_list[y] = temp;
                    }
            }
    }
    for (i = 0; i < n; i++)
       {
           printf("%d: %s\n", i, new_list[i]);
       }
    return new_list;
}

int main(){
    char *ar[5]={
        "eee", "aaa", "bbb", "ccc", "ddd",
    };
    bubble_sort(ar, 5);
    return (0);
}
1 голос
/ 06 июля 2010

filenames - указатель на указатель на символ, поэтому в этой строке ...

new_list = malloc(sizeof(filenames));

... вы выделяете размер размера указателя (на указатель),это не то, что вы хотите.

Вы, вероятно, хотите malloc(sizeof(filenames) * n);, который даст вам место для n указателей.

0 голосов
/ 06 июля 2010

Это что-то вроде дубликата.См .: Создание `char *** data`?

Существуют серьезные проблемы с производительностью памяти при выделении на char ** для двумерного массива.Лучше использовать char * и схему индексации.Таким образом, вы получаете непрерывный кусок памяти.Вы также можете использовать one-D std :: vector с такой схемой.

Если вы должны выделить char **, цикл AF - это все, что вы можете сделать AFAIK.Но, по крайней мере, сделайте из этого подпрограмму!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...