相关疑难解决方法(0)

为什么衰减到数组参数的指针似乎不适用于sizeof()?

我之前读过一个因为与此完全重复而被关闭的问题

当函数具有特定大小的数组参数时,为什么它被指针替换?

如何找到'sizeof'(指向数组的指针)?

但读完之后我仍然对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.我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾?很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个功能而没有真正考虑它.

c c++ pointers

7
推荐指数
2
解决办法
250
查看次数

glibc(GNU C 库)是否提供了一种获取已分配内存块大小的方法?

我有一个指针。我知道它的地址(我作为函数的参数得到),并且我知道它指向先前由malloc()调用分配的内存地址。

有没有办法知道这个分配的内存块的大小?

我更喜欢跨平台的标准解决方案,但我认为这些都不存在。因此,任何事情都可以,即使是核心的低级 malloc 数据结构操作,如果没有更好的话。我将 glibc 与 x86_64 架构一起使用,并且没有计划在其他地方运行结果。我不是在寻找通用答案,它可以特定于 glibc/x86_64。

我认为,这些信息应该可用,realloc()否则无法使用。


这个问题要求通用的、符合标准的解决方案,这是不可能的。我正在寻找一个可能的 glibc/x86_64 解决方案,因为 glibc 是开源的,而 glibcrealloc()需要它来工作,这个问题允许通过在低级 malloc 内部以非标准方式挖掘来回答。

c linux malloc glibc x86-64

6
推荐指数
1
解决办法
185
查看次数

sizeof()在c中检查int array []的sentinel值是什么

让我们考虑一下int array [] = {2,33,4,56,7,8}; //案例A.

如果sizeof()选中'\ 0'作为char []数组的结尾!sizeof(array)检查作为一个sentinel值来查找int数组的结尾,因此在A的情况下数组的大小是多少?

如果我要实现sizeof(intArray),那么访问sentinel值信息是不是自由了?

c arrays sizeof

4
推荐指数
2
解决办法
804
查看次数

C++:sizeof表示数组长度

假设我有一个叫做的宏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**.

c++ macros

3
推荐指数
2
解决办法
3515
查看次数

c ++中动态数组的长度

可能重复:
如何查找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.为什么会这样?

c++ arrays dynamic-arrays

3
推荐指数
2
解决办法
2万
查看次数

为什么int指针的大小与int数组的大小不同?

让我们以下代码:

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)返回代表数组的内存块的大小?

谢谢.

c arrays pointers sizeof

3
推荐指数
2
解决办法
601
查看次数

C数组不能正常工作

所以我在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)的行也不起作用.有解决方法吗?

c

2
推荐指数
1
解决办法
1259
查看次数

用new定义的数组大小?

是否有一个函数(可以编写),它允许知道用new定义的数组的大小:

  int *a=new int[3];
  *a=4;
  *(a+1)=5;
  *(a+2)=6;  
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ arrays sizeof new-operator

2
推荐指数
2
解决办法
165
查看次数

如何知道传递给函数的字符数组的大小(以字节为单位)?

我正在测试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 arrays pointers sizeof char

2
推荐指数
1
解决办法
4857
查看次数

在C函数中更改golang C.String变量的值

我想从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?

go cgo

2
推荐指数
1
解决办法
1473
查看次数

标签 统计

c ×6

arrays ×5

c++ ×4

sizeof ×4

pointers ×3

cgo ×1

char ×1

dynamic-arrays ×1

glibc ×1

go ×1

linux ×1

macros ×1

malloc ×1

new-operator ×1

x86-64 ×1