- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一个循环的输出是 1..20。第二个循环的输出是 1..30。然后第三个循环从 1..9 开始正常,然后由于某种原因它在第十个值处输出 81。
奇怪的是,如果我为第三个循环重新分配 11 个元素并打印 11 个值,那么它会打印 1..11 就好。
我错过了什么?
#include <stdio.h>
int main() {
unsigned int *P;
P = malloc(20 * sizeof(int));
for (int i = 0; i < 20; i ++) {
(*(P + (i+1))) = (i+1);
printf("(%d) Pointer address: %x | Pointer value %d \n", (i+1), (P + (i+1)), *(P + (i+1)));
};
P = realloc(P, 30 * sizeof(int));
printf("------------------------------------------------------------ \n");
printf("After reallocation... \n");
printf("------------------------------------------------------------ \n");
for (int i = 0; i < 30; i ++) {
if (i > 19)
(*(P + (i+1))) = (i+1);
printf("(%d) Pointer address: %x | Pointer value %d \n", (i+1), (P + (i+1)), *(P + (i+1)));
};
P = realloc(P, 10 * sizeof(int));
printf("------------------------------------------------------------ \n");
printf("After deallocation... \n");
printf("------------------------------------------------------------ \n");
for (int i = 0; i < 10; i ++)
printf("(%d) Pointer address: %x | Pointer value %d \n", (i+1), (P + (i+1)), *(P + (i+1)));
return 0;
}
最佳答案
数组索引从 0 开始,而不是从 1 开始。因此可以使用 *(P + 19)
访问数组的最后一个元素。当i = 19
在你的第一个循环中,(*(P + (i+1))) = (i+1);
写入*(P + 20)
这是越界的。越界访问内存是未定义的行为。
删除所有 +1
从代码中的数组访问使其正常运行,即。全部更改P + (i+1)
到只是P + i
。大多数程序员也非常喜欢 P[i]
而不是*(P + i)
为了可读性。另外一些程序员更喜欢写 &P[i]
代替P + i
- i
的地址第一个元素。
另外打印一个指针值 %x
是未定义的行为。 %x
在printf
需要其参数为 unsigned int
。路过unsigned int*
它的值是未定义的行为,它恰好在您的计算机上工作,因为最有可能的大小为 unsigned int
与 unsigned int *
的大小相同。打印指针值的常见方法是使用 %p
printf
说明符并将指针强制转换为 void*
。 (请注意,在大多数体系结构上,实际上并不需要强制转换为 void*
,因为所有指针都具有相同的大小,但不这样做在技术上是未定义的行为。)如果您仍想使用 %x
,您应该将参数转换为正确的类型,例如 (unsigned)(uintptr_t)(P + i)
.
此外,您没有包含 #include <stdlib.h>
对于 malloc
和realloc
功能。您至少应该看到编译器发出的有关隐式声明的警告。这也是未定义的行为,因为隐式声明的函数与实际定义不匹配。隐式声明返回 int
,而malloc
和realloc
返回 void*
.
记住错误处理。每个realloc
和malloc
可以返回 NULL
万一它无法分配内存。
修正这些错误后:
#include <stdio.h>
#include <stdlib.h>
int main() {
unsigned int *P;
P = malloc(20 * sizeof(unsigned int));
for (int i = 0; i < 20; i++) {
P[i] = i + 1;
printf("(%d) Pointer address: %p | Pointer value %d \n",
i + 1, (void*)(P + i), P[i]);
};
P = realloc(P, 30 * sizeof(unsigned int));
printf("------------------------------------------------------------ \n");
printf("After reallocation... \n");
printf("------------------------------------------------------------ \n");
for (int i = 0; i < 30; i ++) {
if (i > 19) {
P[i] = i + 1;
}
printf("(%d) Pointer address: %p | Pointer value %d \n",
i + 1, (void*)(P + i), P[i]);
};
P = realloc(P, 10 * sizeof(unsigned int));
printf("------------------------------------------------------------ \n");
printf("After deallocation... \n");
printf("------------------------------------------------------------ \n");
for (int i = 0; i < 10; i ++)
printf("(%d) Pointer address: %p | Pointer value %d \n",
i + 1, (void*)(P + i), P[i]);
return 0;
}
输出on godbolt :
(1) Pointer address: 0x13c4260 | Pointer value 1
(2) Pointer address: 0x13c4264 | Pointer value 2
(3) Pointer address: 0x13c4268 | Pointer value 3
(4) Pointer address: 0x13c426c | Pointer value 4
(5) Pointer address: 0x13c4270 | Pointer value 5
(6) Pointer address: 0x13c4274 | Pointer value 6
(7) Pointer address: 0x13c4278 | Pointer value 7
(8) Pointer address: 0x13c427c | Pointer value 8
(9) Pointer address: 0x13c4280 | Pointer value 9
(10) Pointer address: 0x13c4284 | Pointer value 10
(11) Pointer address: 0x13c4288 | Pointer value 11
(12) Pointer address: 0x13c428c | Pointer value 12
(13) Pointer address: 0x13c4290 | Pointer value 13
(14) Pointer address: 0x13c4294 | Pointer value 14
(15) Pointer address: 0x13c4298 | Pointer value 15
(16) Pointer address: 0x13c429c | Pointer value 16
(17) Pointer address: 0x13c42a0 | Pointer value 17
(18) Pointer address: 0x13c42a4 | Pointer value 18
(19) Pointer address: 0x13c42a8 | Pointer value 19
(20) Pointer address: 0x13c42ac | Pointer value 20
------------------------------------------------------------
After reallocation...
------------------------------------------------------------
(1) Pointer address: 0x13c52d0 | Pointer value 1
(2) Pointer address: 0x13c52d4 | Pointer value 2
(3) Pointer address: 0x13c52d8 | Pointer value 3
(4) Pointer address: 0x13c52dc | Pointer value 4
(5) Pointer address: 0x13c52e0 | Pointer value 5
(6) Pointer address: 0x13c52e4 | Pointer value 6
(7) Pointer address: 0x13c52e8 | Pointer value 7
(8) Pointer address: 0x13c52ec | Pointer value 8
(9) Pointer address: 0x13c52f0 | Pointer value 9
(10) Pointer address: 0x13c52f4 | Pointer value 10
(11) Pointer address: 0x13c52f8 | Pointer value 11
(12) Pointer address: 0x13c52fc | Pointer value 12
(13) Pointer address: 0x13c5300 | Pointer value 13
(14) Pointer address: 0x13c5304 | Pointer value 14
(15) Pointer address: 0x13c5308 | Pointer value 15
(16) Pointer address: 0x13c530c | Pointer value 16
(17) Pointer address: 0x13c5310 | Pointer value 17
(18) Pointer address: 0x13c5314 | Pointer value 18
(19) Pointer address: 0x13c5318 | Pointer value 19
(20) Pointer address: 0x13c531c | Pointer value 20
(21) Pointer address: 0x13c5320 | Pointer value 21
(22) Pointer address: 0x13c5324 | Pointer value 22
(23) Pointer address: 0x13c5328 | Pointer value 23
(24) Pointer address: 0x13c532c | Pointer value 24
(25) Pointer address: 0x13c5330 | Pointer value 25
(26) Pointer address: 0x13c5334 | Pointer value 26
(27) Pointer address: 0x13c5338 | Pointer value 27
(28) Pointer address: 0x13c533c | Pointer value 28
(29) Pointer address: 0x13c5340 | Pointer value 29
(30) Pointer address: 0x13c5344 | Pointer value 30
------------------------------------------------------------
After deallocation...
------------------------------------------------------------
(1) Pointer address: 0x13c52d0 | Pointer value 1
(2) Pointer address: 0x13c52d4 | Pointer value 2
(3) Pointer address: 0x13c52d8 | Pointer value 3
(4) Pointer address: 0x13c52dc | Pointer value 4
(5) Pointer address: 0x13c52e0 | Pointer value 5
(6) Pointer address: 0x13c52e4 | Pointer value 6
(7) Pointer address: 0x13c52e8 | Pointer value 7
(8) Pointer address: 0x13c52ec | Pointer value 8
(9) Pointer address: 0x13c52f0 | Pointer value 9
(10) Pointer address: 0x13c52f4 | Pointer value 10
关于c - 在数组外部写入然后使用 realloc 后出现错误的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620872/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!