gpt4 book ai didi

C 胖指针实现失败

转载 作者:行者123 更新时间:2023-11-30 16:29:26 34 4
gpt4 key购买 nike

我发现了一个library最近它使用胖指针实现了类似 C++ vector 的功能。

我尝试在一个短程序中复制类似的行为(请参阅下面的代码)。我可以很好地访问数组元素,但是当我尝试获取元素数量时,我的程序会打印垃圾。

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

int main()
{
double * a = NULL;

// the data
double b[] = {1, 2, 3, 5};

a = (int *) malloc(sizeof(int) + sizeof(double *));
a[0] = 4;
a++;
a = b;

// will print 1.0 2.0 3.0 5.0
printf("%lf %lf %lf %lf\n", a[0], a[1], a[2], a[3]);

// prints garbage
printf("%d\n", *((int *) a - 1));

// this will fail
free(((int *) a - 1))
return 0;
}

问题很可能出在代码的指针算术部分,即 (int *) a - 1 指向错误的地址,但我不明白为什么案例。

感谢任何帮助。

最佳答案

将长度打包在数组开头并不是胖指针,而是格式错误的 PASCAL 数组。

int main(fat_pointer);

int main(int argc, char* argv[argc]); // standard signature for main is a fat pointer

胖指针是一个指针和一个索引。索引的数据类型是整型,保证 sizeof index <= sizeof(size_t) 。换句话说,sizeof(int) <= sizeof(size_t)是所有合规托管环境的强制要求,因为 main如此要求。请注意size_t没有为独立环境定义。

_s 的问题功能是它们使用 sal.h来自 Microsoft,允许在声明之前使用变量。

char * strcpy_s(char * restrict dest, rsize_t destsz, char const * restrict src);

// fat pointer form fails
char * strcpy_s(char dest[destsz], rsize_t destsz, char const * src);

胖指针形式失败,因为destsz是在后面声明的,所以不能使用。附件 K 很糟糕,因为它在以胖指针形式声明之前有使用。看main哪里argcargv 之前声明;这是声明胖指针的正确方法。

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

void print_vector_double(int len, double d[len])
{
for (int i = 0; i < len; i++)
printf("%lf ", d[i]);
printf("\n");
printf("%d\n", len);
}

int main(int argc, char* argv[argc])
{
// C89 VLA - initialized VLA
double b[] = { 1, 2, 3, 5, };
int b_len = (int)(sizeof b / sizeof b[0]);
print_vector_double(b_len, b);

// C99 VLA - uninitialized VLA
int c_len = b_len;
double c[c_len];
c = b;
print_vector_double(c_len, c);

// Good Old Heap for Dynamic Arrays
int a_len = b_len;
double * a = malloc(a_len * sizeof * a);
double * temp = memcpy(a, b_len * sizeof * b, b);
if (temp != a) exit(EXIT_FAILURE);
print_vector_double(a_len, a);

free(a), a = NULL, a_len = 0;
}

胖指针是传递给函数的指针。如果您没有将任何内容传递给另一个函数,则不存在胖指针。

Cello 未能理解胖指针到底是什么。

关于C 胖指针实现失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844731/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com