Is it possible to convert char[] to char* in C?
Solution 1:
It sounds like you're confused between pointers and arrays. Pointers and arrays (in this case char *
and char []
) are not the same thing.
- An array
char a[SIZE]
says that the value at the location ofa
is an array of lengthSIZE
- A pointer
char *a;
says that the value at the location ofa
is a pointer to achar
. This can be combined with pointer arithmetic to behave like an array (eg,a[10]
is 10 entries past wherevera
points)
In memory, it looks like this (example taken from the FAQ):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
It's easy to be confused about the difference between pointers and arrays, because in many cases, an array reference "decays" to a pointer to it's first element. This means that in many cases (such as when passed to a function call) arrays become pointers. If you'd like to know more, this section of the C FAQ describes the differences in detail.
One major practical difference is that the compiler knows how long an array is. Using the examples above:
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it's a
// 32 or 64 bit machine)
Without seeing your code, it's hard to recommend the best course of action, but I suspect changing to use pointers everywhere will solve the problems you're currently having. Take note that now:
You will need to initialise memory wherever the arrays used to be. Eg,
char a[10];
will becomechar *a = malloc(10 * sizeof(char));
, followed by a check thata != NULL
. Note that you don't actually need to saysizeof(char)
in this case, becausesizeof(char)
is defined to be 1. I left it in for completeness.Anywhere you previously had
sizeof(a)
for array length will need to be replaced by the length of the memory you allocated (if you're using strings, you could usestrlen()
, which counts up to the'\0'
).You will need a make a corresponding call to
free()
for each call tomalloc()
. This tells the computer you are done using the memory you asked for withmalloc()
. If your pointer isa
, just writefree(a);
at a point in the code where you know you no longer need whatevera
points to.
As another answer pointed out, if you want to get the address of the start of an array, you can use:
char* p = &a[0]
You can read this as "char pointer p
becomes the address of element [0]
of a
".
Solution 2:
If you have
char[] c
then you can do
char* d = &c[0]
and access element c[1] by doing *(d+1)
, etc.
Solution 3:
You don't need to declare them as arrays if you want to use use them as pointers. You can simply reference pointers as if they were multi-dimensional arrays. Just create it as a pointer to a pointer and use malloc
:
int i;
int M=30, N=25;
int ** buf;
buf = (int**) malloc(M * sizeof(int*));
for(i=0;i<M;i++)
buf[i] = (int*) malloc(N * sizeof(int));
and then you can reference buf[3][5]
or whatever.