Declarint Char**

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
aureliuhAsked:
Who is Participating?
 
Fippy_DarkpawCommented:
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
 
Infinity08Commented:
Can you show the exact code you are using ?
0
 
jkrCommented:
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
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
aureliuhAuthor Commented:
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
 
aureliuhAuthor Commented:
I know that shoul be ok. I don;t know what is happening. Could it be from a project setting or something?
0
 
Infinity08Commented:
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
 
grg99Commented:
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
 
jkrCommented:
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
 
jkrCommented:
PS: don't fiorget to 'free()' the array entries afterwards.
0
 
Infinity08Commented:
>> 'pch' is 'recycled' each time it is used, make that

That's not how strtok works ...
0
 
Infinity08Commented:
But str might have gone out of scope by the time you try to access the xxx array.
0
 
Fippy_DarkpawCommented:
Does:

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

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

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

istead
       
0
 
Fippy_DarkpawCommented:
oops. istead = instead hehe. =)
0
 
aureliuhAuthor Commented:
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
 
aureliuhAuthor Commented:
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
 
Infinity08Commented:
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
 
Infinity08Commented:
>> 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
 
Infinity08Commented:
btw :

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

"test1" is a string literal, and that is already null terminated, so yes.
0
 
aureliuhAuthor Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.