百科问答小站 logo
百科问答小站 font logo



请问这段C++代码是未定义行为吗? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

要做动态二维数组,结果没写对。

所以,p应该是指向指针的指针(二级指针),T是实际数据区。 @nekosu 提供了正确的代码我就不再写了。实际工程中,这样的代码很常见。这种用法效率不高,但使用起来比较直观。


user avatar   nekosu-25 网友的相关建议: 
      

我认为这个代码的逻辑应该是没有问题的,稍微改一下就应该可以了

       typedef unsigned int uint; uint **p = (uint**)malloc(h * sizeof(uint*)); // 修改了大小 uint *t = (uint*)malloc(w * h * sizeof(uint)); // 修改了类型 if ( p == nullptr || t == nullptr ) return -1;  memset(t, 0, w * h * sizeof(uint)); for (int i = 0; i < h; i++)     p[i] = t + w * i; // 把4去掉, 指针的加法会自动乘上size, 去掉强转  for (int i = 0; i < h; i++) {     for (int j = 0; j < w; j++) {         p[i][j] = i * h + j;     } }      

我认为这段代码本来想实现的功能是动态定义一个h*w大的uint二位数组p,并且希望每一行是连续的(与两次malloc相对比)。

所以先分配了一个h*w大的uint数组t,然后将p的每一个元素指向t所对应位置。

(我也第一次知道这种技巧,我觉得这是一个很妙的办法)


user avatar   bluedrum 网友的相关建议: 
      

这个代码象操作显示缓存代码,或者矩阵转置?,它的本意

(uint *)( t + w * 4 * i ); 这样做相当于把二维数组操作,换成一维数组

你的猜测是有道理的, 有两个行为让行为不可测1

  1. p[i] = (uint *)( ((char*)t) + w * 4 * i ); 才能精确保存的正确结果

否则以 uint ** 指针加上一定步长,行为是不可测,

2. C语言没有整段buffer 直接赋值操作

因此把 一个 unit* 直接冲掉 另一个unit *操作不好理解,没挂掉有空间有冗余,


正常应该是

for ( int i = 0; i < h; i++ ) {
for ( int j = 0; j < w; j++ ) {
p[i][j] = t[i][j]
}
}


这个需要完整代码才能分析




  

相关话题

  现在 c++中 long 整数类型还有使用的意义吗? 
  MFC中使用LoadLibrary动态加载dll有个数限制吗? 
  cygwin和mingw选哪个? 
  公司要我上一家公司的源代码,该不该给? 
  udp文件传输的问题,采用nack,怎么处理最后几个包丢失的情况? 
  如果人生有的选,18岁的你凭实力拿到清北录取通知书和因为房产红利变成资产总量三千万的家庭,选哪个? 
  C# 虽然在语言层面上更胜 Java 一筹,但是这对于占有率真的很重要吗? 
  c++循环里面定义重名为什么不报错? 
  既然有指针了,为什么c++还搞个引用出来? 
  C++ 实现接口与实现分离后,文件变得更多了,到底有什么好处? 

前一个讨论
最早的操作系统API出现在什么时候?
下一个讨论
通用电脑CPU有无硬件乘法器或硬件乘加器?





© 2024-11-25 - tinynew.org. All Rights Reserved.
© 2024-11-25 - tinynew.org. 保留所有权利