【发布时间】:2019-02-05 04:31:54
【问题描述】:
尝试查看过去处理此问题的问题,但所有这些问题似乎都与 C++ 而不是 C 相关。而且我必须用 C 编写程序。所以我有这部分代码应该执行以下操作:修改strp 指向的现有 kstring 至少为 nbytes 字节长......等等。但是我有该函数的代码,但我不断收到错误消息:从“void*”到“char*”的无效转换。
typedef struct
{
char *data;
size_t length;
} kstring;
功能:
void kstrextend(kstring *strp, size_t nbytes)
{
char *nwData;
int lnth=strp->length;
if(lnth < nbytes)
{
// new array allocate with large size and copy data to new array
nwData = realloc(strp->data, nbytes);
// call abort in case of error
if(nwData == NULL)
{
abort();
}
//Making strp->data point to the new array
strp->data = nwData;
//Setting strp->length to the new size.
strp->length = nbytes;
// filled with '\0' in remaining space of new array
for (int lp = lnth; lp < nbytes; lp++)
{
strp->data[lp] = '\0';
}
}
}
调用函数的主要部分:
name.data = (char*)calloc(sizeof("Hello"), 1);
strcpy(input, "Hello");
name.length=5;
kstrextend(&name,40);
printf("%s %d",name.data,name.length);
【问题讨论】:
-
length和实际分配的字节数似乎有些不一致。例如,sizeof("Hello")是 6,因为它包含尾随空字节,但您使用 5 表示length,并且代码似乎将length视为分配的字节数,而不是少一个。跨度> -
你确定编译成C吗?
-
错误呈现在哪一行?我假设它是 realloc 行?
-
@TomNorth:您必须将其编译为 C++,而不是 C。C 允许在
void *和其他指针类型之间直接赋值,而 C++ 不允许。你不应该从 C 编译器中得到这个错误。你是如何编译这段代码的?请显示您正在使用的确切命令。 -
@TomNorth FYI Putty 只是一个 ssh 终端客户端 - 它与您使用的编译没有任何关系。正如 John Bode 所提到的,将来您应该包含用于编译您遇到问题的命令。此外,如果文件是 C 文件,它应该具有 .c 扩展名而不是 .cc,正如我在答案中提到的,您应该使用 gcc 而不是 g++。
标签: c