我想了解为什么我需要在其中使用malloc。我的代码的目标是将"]"
和")"
从";"
中分离出来。像这样"];"
变成"]"
";"
,");"
变成")"
";"
。CCD_ 10被用作字符串的数组。我记不起字符串数组的技术名称了。这非常有效,但它为我节省了很多时间来理解为什么将来会发生这种情况。
char *ptr[buflen];
for(x = 0; x < n; x++)
{
printf("ptr[x] is %s n", ptr[x]);
cmp_str3 = strcmp(ptr[x], "];");
cmp_str4 = strcmp(ptr[x], ");");
if(cmp_str3 == 0)
{
printf("Match1 n");
strcpy(str1, ptr[x]);
printf("Match2 n");
ptr[x][1] = ' ';
printf("Match3 n");
//printf("ptr[x+1] %c %d n", ptr[x+1], ptr[x+1]);
//printf("ptr[x+1][0] %c %d n", ptr[x+1][0], ptr[x+1][0]);
ptr[x+1] = malloc(strlen("foo") + 1);
ptr[x+1][0] = str1[1];
printf("Match4 n");
ptr[x+1][1] = ' ';
printf("Match5 n");
n++;
}
if(cmp_str4 == 0)
{
}
}
cmp_str3 = 0;
cmp_str4 = 0;
memset(str1, 0, 15);
memset(str2, 0, 15);
声明
char *ptr[buflen];
创建一个指针数组。如果ptr
是一个局部变量(在函数内部),那么指针最初是垃圾值,它们不指向有效内存。如果ptr
是全局的或静态的,那么指针最初是NULL
。
在任何情况下,在使用其中一个指针指向字符串之前,该字符串需要位于内存中的某个位置。
给定线路
char *ptr[3] = {"foo", "bar", "bletch"};
编译器负责为字符串分配内存,然后将指向字符串的指针放入数组中。
但是,如果字符串不是常量,那么您必须自己为字符串分配内存。malloc
就是这么做的。它分配您请求的字节数,并返回一个指向该内存的指针。您可以将该指针保存在数组中,然后使用strcpy
或其他字符串函数将该字符串放入该内存中。
或者你可以一次复制一个字符,这就是你的代码所做的:
ptr[x+1] = malloc(2); // reserves two bytes of memory, and keeps the pointer
// to that memory in the array of pointers
ptr[x+1][0] = str[1]; // copies a character into the first byte of the memory
ptr[x+1][1] = ' '; // marks the second byte as the end of the string
现在,内存中有一个字符串,指针数组中有一条指向该字符串的指针。