Solved

Declarint Char**

Posted on 2007-11-29
19
241 Views
Last Modified: 2010-08-05
Hello,

Could anybody help me with this declaration?
      char* xxx[30];
      xxx[0] = (char*)"test1";
        xxx[1] = (char*)"test2";

After this if I am trying to see the elements from the arrayalways the xxx[0] will be Bad pointer and all the information will start from xxx[1]

        xxx[0] = <Bad pointer>;
        xxx[1] = (char*)"test1";
        xxx[2]= (char*)"test2"    

I have tried with

      char ** x  = new char* [30];

      x[0] = new char[10];

In this case all I got was an empty string

Thank you very much
0
Comment
Question by:aureliuh
  • 7
  • 5
  • 3
  • +2
19 Comments
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376497
Can you show the exact code you are using ?
0
 
LVL 86

Expert Comment

by:jkr
ID: 20376529
Well, using

#include <iostream>
using namespace std;

int main () {

      char* xxx[30];
      xxx[0] = (char*)"test1";
      xxx[1] = (char*)"test2";

      cout << xxx[0] << endl;
      cout << xxx[1] << endl;

      return 0;
}

that works as expected...
0
 

Author Comment

by:aureliuh
ID: 20376535
Yes sure,


char* xxx[30];
 
xxx[0] = (char*)"command";
 
char * pch;
//str is a string that contain a command followed by parameters, separated by & sign
pch = strtok (str,"&");
while (pch != NULL)
{
xxx[counter] = pch;									
counter++;
pch = strtok (NULL, "&");
}

Open in new window

0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 

Author Comment

by:aureliuh
ID: 20376552
I know that shoul be ok. I don;t know what is happening. Could it be from a project setting or something?
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376559
This is not really consistent with the code you posted earlier. What is counter initialized to ? Can you also show the code where you notice the bad pointer problem ?
0
 
LVL 22

Expert Comment

by:grg99
ID: 20376561
If you want an array of 30 pointers, try:

typedef    char *           Str;

typedef    Str               pStr30         [30];


pStr30 xxx;


xxx[ 0 ] = "foo";
xxx[ 1 ] = "goo";






0
 
LVL 86

Expert Comment

by:jkr
ID: 20376564
The problem is

while (pch != NULL)
{
xxx[counter] = pch;   // <--------                                                                
counter++;
pch = strtok (NULL, "&");
}

'pch' is 'recycled' each time it is used, make that

while (pch != NULL)
{
xxx[counter] = strdup(pch);    // <---------
counter++;
pch = strtok (NULL, "&");
}

and it will work.
0
 
LVL 86

Expert Comment

by:jkr
ID: 20376566
PS: don't fiorget to 'free()' the array entries afterwards.
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376576
>> 'pch' is 'recycled' each time it is used, make that

That's not how strtok works ...
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376588
But str might have gone out of scope by the time you try to access the xxx array.
0
 
LVL 4

Accepted Solution

by:
Fippy_Darkpaw earned 500 total points
ID: 20376599
Try this
// array of string pointers
char* xxx[20];
int i;
 
// initialize each pointer array 
for(i=0; i<20; i++)
{
	// create char array
	xxx[i] = new char[10];
 
	// populate array
	strcpy(xxx[i], "012345678");
}
 
// print array
for(i=0; i<20; i++)
{
	printf("%s\n", xxx[i]);
}
 
// delete arrays
for(i=0; i<20; i++)
{
	delete(xxx[i]);
}

Open in new window

0
 
LVL 4

Expert Comment

by:Fippy_Darkpaw
ID: 20376618
Does:

xxx[0] = (char*)"test1";

null terminate the string? That might be the problem. Try using:

strcpy strcpy(xxx[i], "test1");

istead
       
0
 
LVL 4

Expert Comment

by:Fippy_Darkpaw
ID: 20376631
oops. istead = instead hehe. =)
0
 

Author Comment

by:aureliuh
ID: 20376648
I have tryed all the methods that you suggested. I have attached the code

	char* xxx[30];
 
	int counter = 0;
	bool bFoundValue = false;
 
	CRegistry regMyReg;
	if (regMyReg.Open("Registry_Key that I want to open", HKEY_LOCAL_MACHINE)) {
 
		size_t nValueCount = regMyReg.Count();
 
		CRegEntry *reEntry;
		char str [MAX_PATH];
		for ( size_t n = 0; n < nValueCount; n++ ) {
 
			reEntry = regMyReg.GetAt(n);
 
			if (reEntry->IsString() && strstr(reEntry->lpszName, "Command") != NULL) {
				strcpy (str,*reEntry);
				reEntry->Delete();
				bFoundValue = true;
				break;
			}
		}
		if (bFoundValue){
 
			char * pch;
			pch = strtok (str,"&");
			while (pch != NULL)
			{
				xxx[counter] = strdup(pch);								
				counter++;
				pch = strtok (NULL, "&");
			}
 
			Function (xxx); -> here I saw that the first possition is BadPointer
 
			// Pass the xxx to another function
			

Open in new window

0
 

Author Comment

by:aureliuh
ID: 20376678
I saw the bad pointer setting up a breackpoint at the function line. I Go with the mouse over the xxx I can see the values from xxx
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376683
You don't need to use strdup if you don't plan on using xxx when str goes out of scope.

Can you show the implementation of Function ?
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376694
>> I saw the bad pointer setting up a breackpoint at the function line. I Go with the mouse over the xxx I can see the values from xxx

But what happens if you check it in the code ?
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20376702
btw :

>> Does:
>> 
>> xxx[0] = (char*)"test1";
>> 
>> null terminate the string?

"test1" is a string literal, and that is already null terminated, so yes.
0
 

Author Closing Comment

by:aureliuh
ID: 31411766
Thank you very much all of you. The problem was because of my IDE. What can I say. Anyway I consider that the Fippy_DarkPaw gives us a very good example of how to declare a char**. I have searched a lot before I have found out how to use it, so I think maybe there is someone how will need this answer. Thank you again
0

Featured Post

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

825 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question