- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要编写一个函数,它可以接受给定元素类型的任何二维数组。下面的 C 程序说明了我当前的方法。定义明确吗?
#include <stdio.h>
#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])
static void Print(const int *A, int m, int n)
{
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%d ", A[i * n + j]);
}
putchar('\n');
}
}
int main(void)
{
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
Print((int *) A, LEN(A), LEN(A[0]));
return 0;
}
最佳答案
您显示的代码的行为未由 C 标准定义,原因有二。第一,它违反了指针转换的规则。第二,它违反了有关指针运算的规则。
首先,考虑 (int *) A
在调用 Print
.在此代码中,数组 A
自动转换为指向其第一个成员的指针,这是一个包含 3 int
的数组. C 2011 [N1570] 条款 6.3.2.3 第 7 段允许这种转换,其中指出“指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐,则行为未定义。否则,当再次转换回来时,结果应与原始指针相比较。”然而,这就是标准中关于转换指针的全部内容。当您在 Print
中使用指针时, 在表达式 A[i * n + j]
中,该行为未定义,因为 C 标准中没有任何内容告诉我们这个转换后的指针是什么,除了它可以转换回原始类型。尽管指针已转换为 int *
, 我们不知道转换的结果实际上是指向 int
的可用指针那是 A[0][0]
.
其次,即使这个指针是指向 A[0][0]
的有效指针, 标准没有定义当你使用它来索引超出 3 int
的数组时的行为是什么.在表达式 A[i * n + j]
中,下标表达式定义为等同于*((A) + (i * n + j)
通过 6.5.2.1 2. 当 i * n + j
添加到 A
, 语义由 6.5.6 8 管理,它说只要结果指向同一数组中的另一个元素或指向最后一个元素之后的元素,就可以使用指针算术对指针进行加法或减法。如果你有指向第一个 int
的指针3 的数组 int
然后添加足够的指针将指针移动到下一个数组 3 int
,您超出了限制,并且行为未定义。 (由于将 1 指向最后一个元素是合法的,您可以将 3 添加到指向 A[0][0]
的指针以获得指向超出 A[0][2]
的指针,但不允许将 *
应用于此指针,因为该段说“如果结果指向数组对象的最后一个元素之后的一个,则不应将其用作计算的一元 * 运算符的操作数。”)
也就是说,一些 C 实现将支持这些指针转换和这种算法。但是代码不可移植;它不严格符合 C 代码。
关于我可以将多维数组视为一维数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491951/
将“”转换为“>”的主要目的是避免以下内联脚本: var foo = "alert('bug');"; // the value of foo is generated from server
我有以下想法: 在德语中我们有四个额外的字母(ä、ö、ü、ß),我不知道任何其他语言有这些声音,但我认为有口音的法国人也知道这个问题。我们在 Google Play 商店中有很多适用于城市、公交车站、
#!/bin/bash read nameArg find -name "$nameArg" 使用此代码,当我输入例如 *.txt 时,它将为我提供以 txt 结尾的所有文件,但我只想要名称为 *.t
我在 MySQL 5.7.27 中有一个带有 utf8mb4_unicode_ci 排序规则的用户表。 不幸的是, ı 没有像 i 那样进行线程化,例如,以下查询将找不到 Yılmaz select
我的简单 MySQL 查询: SELECT `word` FROM `nouns` WHERE `word` LIKE 'vandenys' 返回: vandenis 但是“vandenYs
虽然我以前用过这样的代码,而且很明显编译器有足够的信息可以工作,但我真的不明白为什么会这样编译: template auto foo(const T& t, I i) { return st
如何实现一个以 int 开头的函数,并在每次(经历有限数量的可能性)返回 1 的几个(例如,5 个) bool 值之一时从中减去 1。 理想情况下的外观是: function list1 list2
因此,如果我的数据库中有一个包含值的表 1 2 3 4 NULL 我执行了查询 SELECT MAX(col1) FROM 我会得到 4。有什么办法可以改变这个,所以 Null 将被视为最大值而不是
例如:我在数据库中有一条记录:[Example] Attena Illusive - 01 [720p].mkv尝试使用查询进行搜索: SELECT ts_rank_cd(to_tsvector('
我试图创建 2 个简单的盒子,并允许用户从 1 个盒子中选择数据,然后将其复制到第二个盒子。如果第二个框中已经有相同的文本,请在后面附加一些简单的文本。 它基本上在该项目不在第二个框中时起作用。但是,
这个问题已经有答案了: How to read a file from jar in Java? (6 个回答) 已关闭10 年前。 我想从我的 *jar 存档中读取文件。我在互联网上阅读了如何从 z
我在 Javascript 中偶然发现了一个我无法理解的极其奇怪的事件。 这是一个非常简单的 if 语句: let hours = 20; 我在这里设置了一个断点,并在调试器中设置了hours = 0
这两个查询给出了完全相同的结果: select * from topics where name='Harligt'; select * from topics where name='Härligt
我有一个包含数值和 NaN 的表格。求和时,如果所选值包含 NaN,则结果将为 NaN。有没有办法让 postgresql 在求和时将它们视为 0 而不是 NaN?或者我只需要将表中的所有 NaN 转
我有一个正在构建的页面,我希望当我滚动(向上或向下)页面时滚动到下一个 div(每个 div 是窗口高度的 100%)。并在那里“固定”,直到您再次滚动。可以在此处看到我正在努力完成的示例: http
我正在用 Javascript 制作一个小的 HTML 页面。它不需要服务器端,但我需要存储这个人所做的事情,所以我正在使用 localStorage。( list ) 如今,浏览器可以选择不存储 c
这两个查询给了我完全相同的结果: select * from topics where name='Harligt'; select * from topics where name='Härligt
我想向 Lua 公开一些 C++ 类。我可以调用Widget:New()获取带有元表集的返回用户数据到表 WidgetMeta . WidgetMeta包含所有 C++ 函数,它是 __index设置
我正在使用一个大型的旧数据库,现在我尝试使用 hibernate 而不是 SQL 来访问它。更大的问题之一是在外键中无限制地使用“0”和“-1”(意思是“NULL”)。 我生成了很多代码,但我手动添加
我试图将一个数字传递到一个 BYTES 数组中 - 但将该数字视为一个字符数组。这是我的代码: for(int i=1;i<=totalFiles;i++) { BYTE* input = n
我是一名优秀的程序员,十分优秀!