C 将内存分配给具有精确字符长度的指针

C 将内存分配给具有精确字符长度的指针,c,pointers,memory-management,C,Pointers,Memory Management,我是c语言的新手,目前正在学习指针,我知道指针指向它所指向的任何东西的内存地址 我的问题是,如何准确分配字符长度的内存,否则将占用50个字节? 让我们假设他们输入了一个标题:饥饿游戏 BOOL AddNewDVD(Database* data){ } 您需要有一个缓冲区来知道输入的名称有多长。这是您的标题,最多可填充49个字符。然后计算len,发现它只有6字节长。您分配字符串使其大小正好为+1 当然,您可以将title的内容写入string,即使title是一个50字节长的缓冲区,并且str

我是c语言的新手,目前正在学习指针,我知道指针指向它所指向的任何东西的内存地址

我的问题是,如何准确分配字符长度的内存,否则将占用50个字节?

让我们假设他们输入了一个标题:饥饿游戏

BOOL AddNewDVD(Database* data){

}

您需要有一个缓冲区来知道输入的名称有多长。这是您的
标题
,最多可填充49个字符。然后计算len,发现它只有6字节长。您分配
字符串
使其大小正好为+1


当然,您可以将
title
的内容写入
string
,即使
title
是一个50字节长的缓冲区,并且
string
只有7字节长-内容的复制以
\0
终止字符结束,这保证在
string

的容量内。您需要有一个缓冲区来知道输入的名称有多长。这是您的
标题
,最多可填充49个字符。然后计算len,发现它只有6字节长。您分配
字符串
使其大小正好为+1


当然,您可以将
title
的内容写入
string
,即使
title
是一个50字节长的缓冲区,并且
string
只有7字节长-内容的复制以
\0
终止字符结束,这保证在
string

的容量内。您需要有一个缓冲区来知道输入的名称有多长。这是您的
标题
,最多可填充49个字符。然后计算len,发现它只有6字节长。您分配
字符串
使其大小正好为+1


当然,您可以将
title
的内容写入
string
,即使
title
是一个50字节长的缓冲区,并且
string
只有7字节长-内容的复制以
\0
终止字符结束,这保证在
string

的容量内。您需要有一个缓冲区来知道输入的名称有多长。这是您的
标题
,最多可填充49个字符。然后计算len,发现它只有6字节长。您分配
字符串
使其大小正好为+1


当然,您可以将
title
的内容写入
string
,即使
title
是一个50字节长的缓冲区,并且
string
只有7字节长-内容的复制以
\0
终止字符结束,这保证在
string

的容量内。您不能使用
scanf
来确定字符串的长度,然后为其分配内存。您需要:

  • 询问用户字符串的长度。显然,这是一个糟糕的选择
  • 创建一个足够大的静态缓冲区,然后创建一个精确长度的动态字符串。问题是,确定字符串的最大长度可能是多少
    fgets
    可能就是您所需要的。考虑下面的代码片段:

    #define MAX_STR_LEN (50)
    
    char buf[MAX_STR_LEN] = {0};
    char *str, *cPtr;
    
    /* Get User Input */
    printf("Enter a string, no longer than %d characters: ", MAX_STR_LEN);
    fgets(buf, MAX_STR_LEN, stdin);
    
    /* Remove Newline Character If Present */
    cPtr = strstr(buf, "\n");
    if(cPtr)
        *cPtr = '\0';
    
    /* Allocate Memory For Exact Length Of String */
    str = malloc(strlen(buf) + 1);
    strncpy(str, buf, strlen(buf));
    
    /* Display Result */
    printf("Your string is \"%s\"\n", str);
    

  • 不能使用
    scanf
    确定字符串的长度,然后为其分配内存。您需要:

  • 询问用户字符串的长度。显然,这是一个糟糕的选择
  • 创建一个足够大的静态缓冲区,然后创建一个精确长度的动态字符串。问题是,确定字符串的最大长度可能是多少
    fgets
    可能就是您所需要的。考虑下面的代码片段:

    #define MAX_STR_LEN (50)
    
    char buf[MAX_STR_LEN] = {0};
    char *str, *cPtr;
    
    /* Get User Input */
    printf("Enter a string, no longer than %d characters: ", MAX_STR_LEN);
    fgets(buf, MAX_STR_LEN, stdin);
    
    /* Remove Newline Character If Present */
    cPtr = strstr(buf, "\n");
    if(cPtr)
        *cPtr = '\0';
    
    /* Allocate Memory For Exact Length Of String */
    str = malloc(strlen(buf) + 1);
    strncpy(str, buf, strlen(buf));
    
    /* Display Result */
    printf("Your string is \"%s\"\n", str);
    

  • 不能使用
    scanf
    确定字符串的长度,然后为其分配内存。您需要:

  • 询问用户字符串的长度。显然,这是一个糟糕的选择
  • 创建一个足够大的静态缓冲区,然后创建一个精确长度的动态字符串。问题是,确定字符串的最大长度可能是多少
    fgets
    可能就是您所需要的。考虑下面的代码片段:

    #define MAX_STR_LEN (50)
    
    char buf[MAX_STR_LEN] = {0};
    char *str, *cPtr;
    
    /* Get User Input */
    printf("Enter a string, no longer than %d characters: ", MAX_STR_LEN);
    fgets(buf, MAX_STR_LEN, stdin);
    
    /* Remove Newline Character If Present */
    cPtr = strstr(buf, "\n");
    if(cPtr)
        *cPtr = '\0';
    
    /* Allocate Memory For Exact Length Of String */
    str = malloc(strlen(buf) + 1);
    strncpy(str, buf, strlen(buf));
    
    /* Display Result */
    printf("Your string is \"%s\"\n", str);
    

  • 不能使用
    scanf
    确定字符串的长度,然后为其分配内存。您需要:

  • 询问用户字符串的长度。显然,这是一个糟糕的选择
  • 创建一个足够大的静态缓冲区,然后创建一个精确长度的动态字符串。问题是,确定字符串的最大长度可能是多少
    fgets
    可能就是您所需要的。考虑下面的代码片段:

    #define MAX_STR_LEN (50)
    
    char buf[MAX_STR_LEN] = {0};
    char *str, *cPtr;
    
    /* Get User Input */
    printf("Enter a string, no longer than %d characters: ", MAX_STR_LEN);
    fgets(buf, MAX_STR_LEN, stdin);
    
    /* Remove Newline Character If Present */
    cPtr = strstr(buf, "\n");
    if(cPtr)
        *cPtr = '\0';
    
    /* Allocate Memory For Exact Length Of String */
    str = malloc(strlen(buf) + 1);
    strncpy(str, buf, strlen(buf));
    
    /* Display Result */
    printf("Your string is \"%s\"\n", str);
    
  • 我不熟悉c语言和学习指针

    指针对初学者来说很难。确保你有一个坚实的基础。< /P> 目前我知道的是指针指向它所指向的任何东西的内存地址

    虽然这在实践中是正确的,但我不喜欢这样想。您所描述的是指针通常是如何实现的,而不是它们在概念上是什么。通过将实现与概念混淆,您将自己设置为以后编写错误代码,从而做出不必要的假设。不要求指针是虚拟内存系统中的地址数字


    更好的方法不是将指针视为地址,而是:

    • 指向t的指针是一个值
    • *
      运算符应用于指向t的指针,会得到一个类型为t的变量
    • &
      运算符应用于类型为t的变量,可以得到指向t的指针
    • 类型为t的变量可以获取或存储类型为t的值
    • 数组是一组变量,每个变量由一个索引标识
    • 如果指针引用的变量与