我有一份学校作业,其中需要我们修改一些代码。我遇到问题的部分是截断动态分配的字符串。我们正在编写一个函数,其中接收指向字符串的指针和字符串的新长度(作为 int)。
void dstring_truncate(DString* destination, unsigned int truncatedLength)
{
assert(destination != NULL);
assert(*destination != NULL);
assert(truncatedLength > 0);
DString temp = (DString)malloc(strlen(*destination) * sizeof(char));
strcpy(temp, *destination);
printf("\n%s test dstring truncate\n", temp);
temp[truncatedLength] = '\0';
temp = (DString)realloc(temp, truncatedLength + 1);
*destination[truncatedLength] = '\0';
*destination = (DString)realloc(*destination, truncatedLength + 1);
printf("%s test dstring truncate after realloc\n", *destination);
}
函数的调用如下所示
dstring_truncate(&str1, 10);
DString 是我们正在使用的 ADT typedef char* DString;
程序中的第一个函数还初始化字符串
DString dstring_initialize(const char* str);
我认为我不理解指针,因为上面代码中的“Temp”按预期工作,但“*destination”却不然。
我尝试过使用“目的地”、“*目的地”、“**目的地”,并且我已经重新观看了给出的材料和一些在线 YouTube/文档,但我就是无法理解这一点。
这也是我编写初始化代码的方式,也许这里有问题?
DString dstring_initialize(const char* str)
{
assert(str != NULL);
DString arr = (DString)malloc((strlen(str) + 1) * sizeof(char));
if (arr == NULL) {
printf("Memory allocation Failed");
return NULL;
}
strcpy(arr, str);
if (strcmp(str, arr) == 0)
{
return arr; // Ersatt denna rad. Den ar just nu med for att programmet ska kompilera
}
}
当您超出之前分配的内存范围时,该错误是典型的。
就像你做的那样
strcpy(temp, *destination);
没有为空终止符分配空间。
请记住,
strlen
不计算空终止符。
快速修复:
DString temp = malloc(strlen(*destination) + 1);