/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
malloc og realloc en double-pointer
Fra : Chris


Dato : 18-05-04 22:59

Hvordan gør det?

Jeg vil gerne have en char **str;
Så vil jeg gerne allokere den og udvide den dynamisk.

int n = 0;

while (n < 10)
{
str[n] = strdup ("gylle");
n++;
}

Hvordan bruger jeg malloc og realloc til dette job?

Venligst
Chris

 
 
Bertel Brander (18-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 18-05-04 23:22

Chris wrote:
> Hvordan gør det?
>
> Jeg vil gerne have en char **str;
> Så vil jeg gerne allokere den og udvide den dynamisk.

Måske noget i stil med:

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

char **Strings;
int NumStrings;

char *MyStringDup(const char *d)
{
char *p = malloc(strlen(d) + 1);
return strcpy(p, d);
}

void Add(const char *s)
{
NumStrings++;
Strings = realloc(Strings, NumStrings*sizeof(char *));
Strings[NumStrings - 1] = MyStringDup(s);
}

int main(void)
{
int i;
Add("Ole");
Add("Gylle");
Add("Whatever");
for(i = 0; i < NumStrings; i++)
{
printf("%s\n", Strings[i]);
free(Strings[i]);
}
free(Strings);
return 0;
}

Bemærk at:
Jeg har udeladt fejlhåndtering.
Der er ingen strdup i standard C
Hvis du har adgang til C++ og STL er der noget lettere at
lave det med std::list & std::string

/b

Bertel Brander (18-05-2004)
Kommentar
Fra : Bertel Brander


Dato : 18-05-04 23:32

Bertel Brander wrote:

> Hvis du har adgang til C++ og STL er der noget lettere at
> lave det med std::list & std::string
>

Med std::vector og std::string kunne det se sådan ud:

#include <iostream>
#include <vector>
#include <string>

std::vector<std::string> List;

void Add(const char *s)
{
List.push_back(s);
}

int main(void)
{
std::vector<std::string>::size_type i;
Add("Ole");
Add("Gylle");
Add("Whatever");
for(i = 0; i < List.size(); i++)
std::cout << List[i] << std::endl;

return 0;
}

/b

Igor V. Rafienko (19-05-2004)
Kommentar
Fra : Igor V. Rafienko


Dato : 19-05-04 00:14

[ Bertel Brander ]

[ ... ]

> for(i = 0; i < List.size(); i++)
> std::cout << List[i] << std::endl;


Pfft...

std::copy(List.begin(), List.end(),
    std::ostream_iterator<string>(cout, "\n"));

:)

[ ... ]





ivr
--
<html><form><input type crash></form></html>

Chris (18-05-2004)
Kommentar
Fra : Chris


Dato : 18-05-04 23:53

On Wed, 19 May 2004 00:21:59 +0200, Bertel Brander
<bertel@post4.tele.dk> wrote:

>Chris wrote:
>> Hvordan gør det?
>>
>> Jeg vil gerne have en char **str;
>> Så vil jeg gerne allokere den og udvide den dynamisk.
>
>Måske noget i stil med:

Og jeg siger tak.
Det var C-versionen, der gjorde det

Chris

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408176
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste