我之前读过一个因为与此完全重复而被关闭的问题
和
但读完之后我仍然对sizeof()的工作原理感到困惑.我理解将数组作为参数传递给函数,如
void foo(int a[5])
Run Code Online (Sandbox Code Playgroud)
将导致数组参数衰减为指针.我在上面的2个问题链接中找不到的是一个明确的答案,为什么sizeof()函数本身免于(或至少看似豁免)这个指针衰减行为.如果sizeof()表现得像任何其他函数那么
int a[5] = {1,2,3,4,5};
cout << sizeof(a) << endl;
Run Code Online (Sandbox Code Playgroud)
然后上面应该输出4而不是20.我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾?很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个功能而没有真正考虑它.
我有一个指针。我知道它的地址(我作为函数的参数得到),并且我知道它指向先前由malloc()调用分配的内存地址。
有没有办法知道这个分配的内存块的大小?
我更喜欢跨平台的标准解决方案,但我认为这些都不存在。因此,任何事情都可以,即使是核心的低级 malloc 数据结构操作,如果没有更好的话。我将 glibc 与 x86_64 架构一起使用,并且没有计划在其他地方运行结果。我不是在寻找通用答案,它可以特定于 glibc/x86_64。
我认为,这些信息应该可用,realloc()否则无法使用。
这个问题要求通用的、符合标准的解决方案,这是不可能的。我正在寻找一个可能的 glibc/x86_64 解决方案,因为 glibc 是开源的,而 glibcrealloc()需要它来工作,这个问题允许通过在低级 malloc 内部以非标准方式挖掘来回答。
让我们考虑一下int array [] = {2,33,4,56,7,8}; //案例A.
如果sizeof()选中'\ 0'作为char []数组的结尾!sizeof(array)检查作为一个sentinel值来查找int数组的结尾,因此在A的情况下数组的大小是多少?
如果我要实现sizeof(intArray),那么访问sentinel值信息是不是自由了?
假设我有一个叫做的宏LengthOf(array):
sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)
当我制作一个23号的新阵列时,我不应该回来23 LengthOf吗?
WCHAR* str = new WCHAR[23];
str[22] = '\0';
size_t len = LengthOf(str); // len == 4
Run Code Online (Sandbox Code Playgroud)
为什么len == 4?
更新:我做了一个错字,这是一个WCHAR*,而不是一个WCHAR**.
可能重复:
如何查找sizeof(指向数组的指针)
我声明了一个像这样的动态数组:
int *arr = new int[n]; //n is entered by user
Run Code Online (Sandbox Code Playgroud)
然后用它来查找数组的长度:
int len = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)
它给len作为1代替n.为什么会这样?
让我们以下代码:
int x;
int *p = &x;
int t[3];
Run Code Online (Sandbox Code Playgroud)
然后sizeof返回:
sizeof(x) -> 4
sizeof(p) -> 8
sizeof(t) -> 12
Run Code Online (Sandbox Code Playgroud)
我想这sizeof(t)是结果3 * sizeof(int).但是作为t指向他的第一个元素的指针,它的大小应该是sizeof(p).
为什么sizeof(t)返回代表数组的内存块的大小?
谢谢.
所以我在main方法中有一个C字符串(字符数组),当我将它作为参数传递给另一个方法时,它的大小会发生变化.
void method(char* arr){
printf( "%u\n", sizeof(arr) ); //returns 4, in my program.
arr = "hello "; //executes just fine
char arr2[9] = "people";
strcat(arr, arr2); // (1) here is where it crashes down
int i = 0; while(i < sizeof(arr2)){ arr[i+6] = arr2[i]; i++;} // (2) this causes it to crashdown too
}
int main(){
char array[33];
printf("%u\n", sizeof(array) ); //returns 33, in my program.
method(array);
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?,我该如何解决?这是否意味着我无法为C字符串添加更多值?我怀疑这可能是我的程序不断崩溃的原因(每当我尝试添加n时).标记为(1)和(2)的行也不起作用.有解决方法吗?
是否有一个函数(可以编写),它允许知道用new定义的数组的大小:
int *a=new int[3];
*a=4;
*(a+1)=5;
*(a+2)=6;
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在测试sizeof运算符。在我的代码中的两种情况下,我得到了指针的大小(我认为)。在其他情况下,我得到数组占用的字节数。 将数组传递给函数时,如何以字节为单位获取数组的大小? 不是的sizeof操作符就够了吗?难道我做错了什么?
#include <stdio.h>
/*Testing the operator sizeof*/
void test (char arrayT[]);
void test2 (char *arrayU);
int main(int argc, char *argv[]){
char array1[7];
printf("array1 size is:%d\n", sizeof array1);
/*array1 size is: 7*/
char array2[] = { '1', '2', '3', '4', '5', '6', '7'};
printf("array2 size is:%d\n", sizeof array2);
/*array2 size is: 7*/
char array3[] = "123456";
printf("array3 size is:%d\n", sizeof array3);
/*array3 size is: 7*/
unsigned char array4[] = …Run Code Online (Sandbox Code Playgroud) 我想从C函数中获取一个int和string.int - 错误代码,字符串 - 数据.
试过这样的方式:
package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int test(char *out){
snprintf(out, sizeof out, "1234567890abcd");
return 0;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
foo := C.CString("")
defer C.free(unsafe.Pointer(foo))
C.test(foo)
fmt.Println("Output is: "+C.GoString(foo))
}
Run Code Online (Sandbox Code Playgroud)
它几乎奏效了.
输出为:1234567
但应该是:1234567890abcd
我认为传递给C函数的C.String的大小是8.但是我不知道如何扩展它(固定大小<> 8)或变为动态.
所以问题是:我应该如何将该变量传递给C?