我这样做对吗C代码
当我运行这个程序时,它说大小是4,而实际上是6。它在这里这样做:我这样做对吗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
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
我想你期待的是