我有二维数组。我希望将该数组分配给struct。请看一下:
这是我的结构:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
@Table(name = "item_refund_detail")
@Entity
public class ItemRefundDetail implements Serializable {
private static final long serialVersionUID = 4604092182622619714L;
RefundTransaction refundTransaction;
@ManyToOne
@JoinColumn(name="refund_request_id")
public RefundTransaction getRefundTransaction() {
return refundTransaction;
}
public void setRefundTransaction(RefundTransaction refundTransaction) {
this.refundTransaction = refundTransaction;
}
@Id
@Column(name = "order_id")
String orderId;
@Id
@Column(name = "unique_item_id")
String uniqueItemId;
Double amount;
// @Column(name = "refund_request_id")
// String refundRequestId;
@Id
@Column(name = "refund_transaction_id")
String refundTransactionId;
@Column(name = "transaction_ref")
String transactionRef;
@Transient
InstrumentType instrumentType;
@Id
@Column(name = "order_id")
public String getOrderId() {
return orderId;
}
@Id
@Column(name = "unique_item_id")
public String getUniqueItemId() {
return uniqueItemId;
}
public Double getAmount() {
return amount;
}
// @Column(name = "refund_request_id")
// public String getRefundRequestId() {
// return refundRequestId;
// }
@Id
@Column(name = "refund_transaction_id")
public String getRefundTransactionId() {
return refundTransactionId;
}
@Column(name = "transaction_ref")
public String getTransactionRef() {
return transactionRef;
}
@Transient
public InstrumentType getInstrumentType() {
return instrumentType;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public void setUniqueItemId(String uniqueItemId) {
this.uniqueItemId = uniqueItemId;
}
public void setAmount(Double amount) {
this.amount = amount;
}
// public void setRefundRequestId(String refundRequestId) {
// this.refundRequestId = refundRequestId;
// }
public void setRefundTransactionId(String refundTransactionId) {
this.refundTransactionId = refundTransactionId;
}
public void setTransactionRef(String transactionRef) {
this.transactionRef = transactionRef;
}
public void setInstrumentType(InstrumentType instrumentType) {
this.instrumentType = instrumentType;
}
}
我希望能够分配这个:
typedef struct {
int x;
int y;
char **table; //2-dim array
} some_struct;
或者这个:
const char sth1_table[2][3] = {
{ ' ', 'x', ' '},
{ 'x', 'x', 'x'},
};
到那个结构。
怎么做? 我尝试过分配:
const char sth2_table[4][2] = {
{ 'x', ' '},
{ 'x', ' '},
{ 'x', ' '},
{ 'x', 'x'},
};
然后访问:
new_sth.table = malloc(sizeof(sth1_table));
*new_sth.table = sth1_table;
但没有运气。
我做错了什么?
答案 0 :(得分:1)
对于初学者,成员typedef struct {
int x;
int y;
char **table; // pointer
} some_struct;
some_struct obj;
不是二维数组。这是一个指针。
数组没有赋值运算符。您必须逐个元素地复制数组。
例如,如果你有一个结构对象
const char sth1_table[2][3] = {
{ ' ', 'x', ' '},
{ 'x', 'x', 'x'},
};
和数组
obj.table = malloc( sizeof( char *[2] ) );
for ( size_t i = 0; i < 2; i++ )
{
obj.table[i] = malloc( sizeof( sth1_table[i] ) );
memcpy( obj.table[i], sth1_table[i], sizeof( sth1_table[i] ) );
}
然后你可以采取以下方式
CREATE PROCEDURE tableCreation
(
@tableName SYSNAME
)
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
CREATE TABLE ' + @tableName + ' (
id INT NOT NULL
)'
--PRINT @SQL
EXEC sys.sp_executesql @SQL
END
GO
EXEC dbo.tableCreation @tableName = 'Employee'
您应该记住,当您需要使用另一个二维数组作为初始化程序时,您必须释放所有已分配的内存或重新分配它。
答案 1 :(得分:0)
如果您可以使用硬编码的数组大小并且不使用malloc, 我会考虑这个例子:
#include <stdio.h>
#include <stdlib.h>
struct Some_Struct
{
int x;
int y;
char sth1_table[2][3];
char sth2_table[4][4];
};
int main ( int argc, char *argv[] )
{
struct Some_Struct yy;
struct Some_Struct zz[10];
yy.x = 1;
yy.y = 2;
/*
you wanted this
const char sth1_table[2][3] = {
{ ' ', 'a', ' '},
{ 'b', 'c', 'd'},
};
*/
yy.sth1_table[0][0] = '\0'; /* null character */
yy.sth1_table[0][1] = 'a';
yy.sth1_table[0][2] = '\0';
yy.sth1_table[1][0] = 'b';
yy.sth1_table[1][1] = 'c';
yy.sth1_table[1][2] = 'd';
for ( i = 0; i < 10; i++ )
{
zz[i].sth1_table[0][0] = '\0'; /* null character */
zz[i].sth1_table[0][1] = 'a';
zz[i].sth1_table[0][2] = '\0';
zz[i].sth1_table[1][0] = 'b';
zz[i].sth1_table[1][1] = 'c';
zz[i].sth1_table[1][2] = 'd';
}
}
如果您对运行时分配感兴趣,那么除了malloc()之外还要考虑calloc()函数。这样做时,请记住二维数组(或三维,四维,任意维)的内存分配只是一块内存,其大小是维数乘以类型大小。
char sth1_table[2][3];
char的大小是1个字节。 1字节* 2 * 3 = sth1_table的6字节内存
char sth2_table[4][4];
1字节* 4 * 4 = 16字节的内存sth2_table
然后您如何选择在分配的内存中订购数据, 无论是排第一还是第一列,完全取决于你。
答案 2 :(得分:-1)
我没有直接使用 malloc ,而是建议为内存分配定义一个宏。这使代码更容易遵循。在下面的示例中,我冒昧地重命名了一些标识符。
{{1}}