这个问题涉及但来自不同这一个约在C99可变长度数组.
答案指出,在堆栈中分配可变长度数组(或者只是固定大小的大数组)的一个危险是分配可能会无声地失败,而不是调用malloc,这显然告诉调用者分配是否成功.
现代非嵌入式编译平台使用无效的内存区域来检测一些堆栈溢出,而无需额外成本(检查只是MMU已经免费进行的检查).这不能保证100%免受上述问题的影响,因为非常大的本地数组可能导致堆栈指针跳过无效区域.
有没有人知道通常会为此检测分配多少页?我想这至少是4KiB,但它可能会更多.这是由编译器或操作系统做出的选择,在任何一种情况下,有没有办法改变它?
我正在试验C11和VLA,试图在堆栈上声明一个只有不完整声明的结构变量.目标是提供一种机制来创建一些结构类型的变量而不显示内部(如PIMPL惯用法),但不需要在堆上创建变量并返回指向它的指针.此外,如果结构布局发生更改,我不想重新编译使用该结构的每个文件.
我设法编写了以下内容:
private.h:
#ifndef PRIVATE_H_
#define PRIVATE_H_
typedef struct A{
int value;
}A;
#endif /* PRIVATE_H_ */
Run Code Online (Sandbox Code Playgroud)
public.h:
#ifndef PUBLIC_H_
#define PUBLIC_H_
typedef struct A A;
size_t A_getSizeOf(void);
void A_setValue(A * a, int value);
void A_printValue(A * a);
#endif /* PUBLIC_H_ */
Run Code Online (Sandbox Code Playgroud)
implementation.c:
#include "private.h"
#include "stdio.h"
size_t A_getSizeOf(void)
{
return sizeof(A);
}
void A_setValue(A * a, int value)
{
a->value = value;
}
void A_printValue(A * a)
{
printf("%d\n", a->value);
}
Run Code Online (Sandbox Code Playgroud)
main.c中:
#include <stdalign.h>
#include <stddef.h>
#include "public.h"
#define …Run Code Online (Sandbox Code Playgroud) 在这篇文章中,OP包含有很多错误的代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行:
int n = 100000, arr[n];
Run Code Online (Sandbox Code Playgroud)
是否确保了声明和初始化的顺序?
所以在这里我会假设它甚至可能发生n在arr获得声明时没有被初始化,看起来很不好.
但是我无法在iso/iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它.
这是因为我假设未定义的行为?或者是吗?
无论哪种方式,该结果适用的规则是什么?5
编辑:
这对C99也有效吗?
看到这个测试程序:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc < 2)
goto end;
char s[strlen(argv[1]) + 1];
strcpy(s, argv[1]);
printf("s=%s\n", s);
end:
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它无法编译错误"跳转到具有可变修改类型的标识符范围"(参见其他问题).
但是,如果我将声明更改s为this(和include alloca.h),它编译得很好:
char *s = alloca(strlen(argv[1]) + 1);
Run Code Online (Sandbox Code Playgroud)
为什么C标准允许跳入使用alloca但不是可变长度数组创建的对象的范围?我认为他们是等同的.
有什么方法可以将可变长度列表存储到SQL或任何其他数据库引擎的数据库中?
这里的清单表示没有。数组中的元素。例如,数字数组。
但是在我的实际应用中,要存储的东西是对象,因此不能简单地以逗号分隔的列表形式存储。
我正在尝试编写一个在c中采用可变大小数组的函数.
void sort(int s, int e, int arr[*]){
...
}
Run Code Online (Sandbox Code Playgroud)
它表示对于可变长度数组,它需要在函数声明中有界.那是什么意思?我正在使用xcode 4.0,使用LLVM编译器2.0.
谢谢您的帮助.
我看到一些像这样的代码:
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
Run Code Online (Sandbox Code Playgroud)
我很困惑这将如何工作,甚至编译gcc.数组的大小应该是静态的并在编译时确定,不是吗?
我正在构建一个Tensorflow模型来对文本短语进行推理.为简单起见,假设我需要一个具有固定数量的输出类但输入中的可变长度文本的分类器.换句话说,我的迷你批次将是一系列短语,但并非所有短语都具有相同的长度.
data = ['hello',
'my name is Mark',
'What is your name?']
Run Code Online (Sandbox Code Playgroud)
我的第一个预处理步骤是在字典中构建一个包含所有可能单词的字典,并将每个单词映射到整数单词-Id.输入变为:
data = [[1],
[2, 3, 4, 5],
[6, 4, 7, 3]
Run Code Online (Sandbox Code Playgroud)
处理这种输入的最佳方法是什么?tf.placeholder()可以在同一批数据中处理可变大小的输入吗?或者我应该填充所有字符串,使它们都具有相同的长度,等于最长字符串的长度,使用一些占位符来删除单词?如果某些字符串比大多数其他字符串长得多,这似乎是非常低效的内存.
- 编辑 -
这是一个具体的例子.
当我知道我的数据点的大小(并且所有数据点具有相同的长度,例如.3)时,我通常使用类似的东西:
input = tf.placeholder(tf.int32, shape=(None, 3)
with tf.Session() as sess:
print(sess.run([...], feed_dict={input:[[1, 2, 3], [1, 2, 3]]}))
Run Code Online (Sandbox Code Playgroud)
其中占位符的第一个维度是小批量大小.
如果输入序列是不同长度的句子中的单词怎么办?
feed_dict={input:[[1, 2, 3], [1]]}
Run Code Online (Sandbox Code Playgroud) 被迫将可变长度数组功能用于打印方阵的辅助函数,我将其定义如下:
void print_matrix(M, dim)
unsigned dim;
int M[dim][dim];
{
/* Print the matrix here. */
...
Run Code Online (Sandbox Code Playgroud)
好消息是,代码可以正常工作,并且其参数按照我希望的顺序排列。
dim坏消息是,我必须使用“旧式”函数声明语法才能引用的声明中尚未声明的参数M,这显然被认为是过时且危险的。
是否有一种直接的方法可以对“新式”函数声明执行相同的操作而不更改参数的顺序?(如果不是,在这种特殊情况下使用旧式语法是否可以接受?)
在我本科 C 编程课程的大部分时间里,我们学习了 C99,我们的讲师从不费心教我们 C99 和以前版本之间的主要区别。
我们最近被告知,我们可能会被要求在下一次考试期间使用 C89 实施解决方案。
我的问题是关于函数内部声明和使用的可变长度多维数组的使用。
在 C99 中,我可以有这样的功能:
void func(int cols, int mat[][cols], int rows);
Run Code Online (Sandbox Code Playgroud)
而在 C89 中,VLA 和类似的装置是不合法的。有人告诉我,您需要改用指向指针的指针。所以像:
void func(int **mat, int cols, int rows);
Run Code Online (Sandbox Code Playgroud)
但是,我在理解方面遇到了问题:
mat[i][j]吗?int **mat;吗?我认为您必须使用malloc(),但我很难弄清楚确切的声明语句。边问。仍然关于可变大小的矩阵,有人告诉我有这样的设置:
int rows, cols;
// get rows and cols from stdinput
int mat[rows][cols];
Run Code Online (Sandbox Code Playgroud)
由于程序堆栈上的分配,这不是创建具有给定维度的矩阵的最佳方法。什么是更好的方法?
谢谢!