我有一个函数*getText()
,其中最终结果是我需要从函数返回的数组。据我所知,这是不可能直接的,所以我创建了一个指针如下:
char *ptr = &plainText[0];
return ptr;
我还是C的新手并不熟悉指针,所以我创建了一些代码来将指针转换回我需要的函数中的数组:
int i;
char plainText[256];
for (i=0; *(getText()+i) == '\0'; i++){
plainText[i] = *(getText()+i);
}
这里的想法是for循环将遍历指针指向的字符串,直到找到结束('\0'
),并为每个字符添加字符串。
但是,虽然程序在gcc中编译时没有编译器错误,但是当它到达这段代码时,它会在没有任何运行时错误的情况下中止。
有人可以给我一些关于让它发挥作用的指导吗?
詹姆斯
答案 0 :(得分:3)
如果仔细考虑一下,你会发现“将指针转换为数组”毫无意义。
数组是一个连续的内存块,你给了一个名字。
指针是内存地址。
您无法将指针转换为数组 - 您会如何突然将地址更改回内存块?您需要改为创建一个新块,并将其复制到那里。
当然,首先提供原始指针存在。在您的情况下,它似乎是一个本地数组,这意味着它在您尝试将其数据复制到另一个数组时会被销毁。
答案 1 :(得分:1)
也许您的意思是*(getText()+i) != '\0'
,否则您的循环条件将始终立即终止
答案 2 :(得分:1)
这太棒了。只是不要做任何你正在做的事情,退后一步,深呼吸......
需要返回数组的C函数通常只需将指针和最大大小作为参数,并写入该空间即可。例如,请参阅strncat。
所有这些来回复制都应该是一个红旗,说明事情不对。 :)
答案 3 :(得分:0)
阅读一本好的C编程书。你会发现数组经常是(但并不总是)被视为指针。
您可能不希望在每次迭代时调用getText()
,因此将其放入变量中。
您的测试应该是“不同的空字符”。
编译所有启用的警告并进行调试。在Linux上使用gcc
表示gcc -Wall -g
。了解如何在Linux上使用gdb
之类的调试器。
答案 4 :(得分:0)
指向数组的指针与指向数组中第一个元素的指针相同。它只是一个地址值。
所以
char ch [10];
ch与& ch [0]
相同现在您不需要任何此操作来复制以空字符结尾的字符串。只需使用strcpy()