我这样做对吗C代码

我这样做对吗C代码,c,memory,dynamic,allocation,C,Memory,Dynamic,Allocation,当我运行这个程序时,它说大小是4,而实际上是6。它在这里这样做: printf("String Size: %u\n", sizeof some_string.basic_string); 我是c内存分配新手,以前从未使用过malloc。我使用malloc对吗 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> typedef struct

当我运行这个程序时,它说大小是4,而实际上是6。它在这里这样做:

printf("String Size: %u\n", sizeof some_string.basic_string);
我是c内存分配新手,以前从未使用过malloc。我使用malloc对吗

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct String String;

struct String {
  char *basic_string;
};

String String_New(char basic_string[]) {
  String temp;
  temp.basic_string = (char *) malloc(sizeof basic_string);
  strcpy(temp.basic_string, basic_string);
  return temp;
}

void String_Delete(String *string) {
  free(string->basic_string);
  string->basic_string = NULL;
}

int String_GetSize(String string) {
  int i = 0, s = 0;
  while (string.basic_string[i] != '\0') {
    i++;
    s++;
  }
return s;
}

int main(int argc, char *argv[]) {
  String some_string = String_New("hello");
  printf("String Literal: %s\n", some_string.basic_string);
  printf("String Size: %u\n", sizeof some_string.basic_string);
  printf("String Length: %d\n", String_GetSize(some_string));
  String_Delete(&some_string);

  if (some_string.basic_string == NULL) {
    return 0;
  }

  return 1;
}
#包括
#包括
#包括
#包括
typedef结构字符串;
结构字符串{
字符*基本_字符串;
};
字符串字符串\u新建(字符基本\u字符串[]){
字符串温度;
temp.basic_字符串=(char*)malloc(basic_字符串的大小);
strcpy(临时基本字符串、基本字符串);
返回温度;
}
无效字符串\u删除(字符串*字符串){
自由(字符串->基本字符串);
字符串->基本字符串=空;
}
int String_GetSize(字符串){
int i=0,s=0;
while(string.basic_string[i]!='\0'){
i++;
s++;
}
返回s;
}
int main(int argc,char*argv[]){
String some_String=String_New(“你好”);
printf(“字符串文字:%s\n”,一些字符串。基本字符串);
printf(“字符串大小:%u\n”,某些\u字符串的大小。基本\u字符串);
printf(“字符串长度:%d\n”,字符串大小(一些字符串));
字符串\u删除(&some\u字符串);
if(some_string.basic_string==NULL){
返回0;
}
返回1;
}

字符*基本字符串
是指向某个内存的指针,指针的大小(在32位系统上)为32位=4字节。Sizeof不知道您在此地址保留的内存大小


通常没有办法获得malloc保留的内存大小,尽管您的系统可能有一些专用调试功能来实现这一点

char*基本字符串
是指向某个内存的指针,指针的大小(在32位系统上)为32位=4字节。Sizeof不知道您在此地址保留的内存大小


通常没有办法获得malloc保留的内存大小,尽管您的系统可能有一些专用调试功能来实现这一点

在助手函数String_New()中,当您说“sizeof(basic_String)”时,您要求的是指针的大小,而不是字符串的大小,这就是为什么您得到的是4而不是6。我想你想要的是:-

String String_New(const char* basic_string) {
  String temp;
  temp.basic_string = (char *) malloc(strlen(basic_string)+1);
  strcpy(temp.basic_string, basic_string);
  return temp;
}

sizeof度量编译时类型的大小;字符串参数将是运行时变量。

在助手函数string_New()中,当您说“sizeof(basic_string)”时,您要求的是指针的大小,而不是字符串的大小,这就是为什么您得到4而不是6。我想你想要的是:-

String String_New(const char* basic_string) {
  String temp;
  temp.basic_string = (char *) malloc(strlen(basic_string)+1);
  strcpy(temp.basic_string, basic_string);
  return temp;
}
sizeof度量编译时类型的大小;字符串参数将是运行时变量。

在C中,“字符串”不是真正的数据类型。sizeof运算符采用数据类型,或采用“类型”作为操作数的对象。在您的例子中,对象是
some\u string.basic\u string
,其类型为
char*
,系统上的指针大小为4

解决方案是将字符串结构定义为具有大小成员:

struct String {
  char *basic_string;
  size_t length ;
};
并在
String\u New()
中分配时存储大小。这将简化并提高
String\u GetSize()
函数的效率(由于s==i,函数已经过于复杂)

还要注意,在
String\u New()
中,
basic\u String
参数也是一个指针(尽管其签名中使用了“数组语法”)。我会避免使用这种语法,因为在C语言中,除非数组嵌入到结构中,否则不能逐个副本传递数组,这是一种误导;数组在作为参数传递时总是“降级”到指针。此外,调用方在任何情况下都可以传递指针而不是数组。因此,在大多数情况下,分配的内存太少(4字节)。您应该使用
strlen()
或最初在
String\u GetSize()
中使用的方法来确定长度

String String_New(char* basic_string) 
{
  String temp;
  temp.length = strlen( basic_string ) ;
  temp.basic_string = (char *) malloc( temp.length + 1 );

  strcpy(temp.basic_string, basic_string);
  return temp;
}

size_t String_GetSize(String string) 
{
    return string.length ;
}
在C语言中,“字符串”不是真正的数据类型。sizeof运算符采用数据类型,或采用“类型”作为操作数的对象。在您的例子中,对象是
some\u string.basic\u string
,其类型为
char*
,系统上的指针大小为4

解决方案是将字符串结构定义为具有大小成员:

struct String {
  char *basic_string;
  size_t length ;
};
并在
String\u New()
中分配时存储大小。这将简化并提高
String\u GetSize()
函数的效率(由于s==i,函数已经过于复杂)

还要注意,在
String\u New()
中,
basic\u String
参数也是一个指针(尽管其签名中使用了“数组语法”)。我会避免使用这种语法,因为在C语言中,除非数组嵌入到结构中,否则不能逐个副本传递数组,这是一种误导;数组在作为参数传递时总是“降级”到指针。此外,调用方在任何情况下都可以传递指针而不是数组。因此,在大多数情况下,分配的内存太少(4字节)。您应该使用
strlen()
或最初在
String\u GetSize()
中使用的方法来确定长度

String String_New(char* basic_string) 
{
  String temp;
  temp.length = strlen( basic_string ) ;
  temp.basic_string = (char *) malloc( temp.length + 1 );

  strcpy(temp.basic_string, basic_string);
  return temp;
}

size_t String_GetSize(String string) 
{
    return string.length ;
}

否,
String\u New
中的
malloc
应该使用字符串的实际运行时长度,例如

String String_New(char basic_string[]) {
  String temp;
  int length = strlen(basic_string);
  temp.basic_string =
     (char *) malloc(length+1); /* 1 more byte for terminating \0 */
  strcpy(temp.basic_string, basic_string);
  return temp;
}

但是您应该只使用
strdup
例如
temp.basic\u string=strdup(basic\u string)

否,新
字符串中的
malloc
应使用字符串的实际运行时长度,例如

String String_New(char basic_string[]) {
  String temp;
  int length = strlen(basic_string);
  temp.basic_string =
     (char *) malloc(length+1); /* 1 more byte for terminating \0 */
  strcpy(temp.basic_string, basic_string);
  return temp;
}

但是您应该只使用
strdup
例如
temp.basic\u string=strdup(basic\u string)

我认为您希望
sizeof
做与
strlen()
相同的事情,或者您的
String\u GetSize()
做的事情。这不是它的目的


您正在对
char*
指针执行
sizeof
,即“此
char*
的大小是多少”,这是一个与“此
char*
指向的字符串有多长”不同的问题。在大多数(如果不是全部的话)32位平台上,
sizeof(char*)
实际上将是
4

我想你期待的是