【问题标题】:Why should I declare a String as a fixed-size array为什么我应该将 String 声明为固定大小的数组
【发布时间】:2018-08-01 14:34:10
【问题描述】:

我有这个程序:

#include<stdio.h>

void copy_string(char string1[], char string2[]){
    int counter=0;
    while(string1[counter]!='\0'){
        string2[counter] = string1[counter];
        counter++;
    }
    string2[counter] = '\0';
}

int main() {
   char* myString = "Hello there!";
   char* myStringCopy;
   copy_string(myString, myStringCopy);
   printf("%s", myStringCopy);
}

我的问题是,除非我将 myStringCopy 声明为固定大小的变量 (char myStringCopy[12];),否则它为什么不起作用?如果我在复制后添加一个\0 字符,它不应该工作吗?

【问题讨论】:

  • 问题是没有为myStringCopy分配空间。它只是一个未指向有效内存位置的单元化指针,因此您不能对其进行写入。

标签: c arrays string pointers


【解决方案1】:

只要你为它分配内存空间,它就可以通过char* myStringCopy来工作。

例如

char* myStringCopy
myStringCopy = malloc(sizeof(char) * (strlen(myString)+1))

我可能对 +1 有误解,但我认为是这样的。

【讨论】:

【解决方案2】:

char myStringCopy[12]; 告诉编译器创建一个包含 12 个char 的数组。当myStringCopy 被传递给copy_string 时,该数组会自动转换为指向其第一个元素的指针,因此copy_string 会收到指向字符的指针。

char *myStringCopy; 告诉编译器创建一个指向char 的指针。编译器创建这个指针,包括为其提供内存,但它不设置指针的值。当此指针传递给copy_string 时,copy_string 不会收到有效值。

要使char *myStringCopy; 工作,您必须分配内存(您可以使用malloc 来完成)。例如,您可以使用:

char *myStringCopy;
myStringCopy = malloc(13 * sizeof *myStringCopy);
if (myStringCopy == NULL)
{
    fprintf(stderr, "Error, the malloc did not work.\n");
    exit(EXIT_FAILURE);
}

另外,请注意 12 是不够的。字符串“你好!”包含 12 个字符,但也包含终止空字符。您必须为空字符提供空间。 char myStringCopy[12]; 似乎可以工作,但 copy_string 实际上是在数组之外写入了第 13 个字符,从而损坏了程序中的其他内容。

【讨论】:

  • 在不知道字符串长度的情况下怎么办?
  • @CarlosMorente:您可以通过计算源字符串中的字符来找到字符串长度,直到并包括终止空字符。另外,如果你想让copy_string进行分配,那么它必须将新分配的地址返回给调用者。
【解决方案3】:

问题是你没有空间给mystringCopy

您需要先预留空间:

   char* myString = "Hello there!";
   char* myStringCopy = malloc(strlen(myString) + 1);

【讨论】:

    【解决方案4】:
    char* myStringCopy;
    

    这只是指向 char* 的指针。在开始复制之前,您必须首先为 myStringCopy 分配内存。当你这样声明时:

    char myStringCopy[12];
    

    编译器在堆栈中分配足够的内存。

    【讨论】:

    • 我知道,我只回答问题。并从用户代码中复制语句。
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2012-04-25
    • 2012-11-10
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多